CODING TEST/programmers

Day5 - 등차수열의 특정한 항만 더하기

iamyuunzo 2025. 7. 12. 11:59

📌 문제 정보

- 문제 이름 : 코딩 기초 테스트 - a와 b 출력하기

- 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/181931

 

 

📌 문제 요약

핵심 조건: 첫째항이 a, 공차가 d인 등차수열에서 included[i]가 i + 1항을 의미할 때, 이 등차수열의 1항부터 n항까지 included가 true인 항들만 더한 값을 return

- 제한: 1 ≤ a, d ≤ 100  /  1 ≤ included의 길이 ≤ 100  /  included에는 true가 적어도 하나 존재함.

 

 

📌 내 풀이 및 코드

class Solution {
    public int solution(int a, int d, boolean[] included) {
        int answer = 0;

        for (int i = 0; i < included.length; i++) {
            int term = a + (i * d);

            if (included[i]) {
                answer += term;
            }
        }

        return answer;
    }
}

- for문으로 접근하는 방법까지는 알았으나 그 이후로 모르겠.. 그래서 그냥 틀리고 답을 봤음.

- 등차수열 항을 하나씩 만들어서, true인 항만 골라서 다 더함.

1️⃣ 첫째항 a와 공차 d를 이용 -> 등차수열의 i번째 항 : a + i × d.

2️⃣ included[i] = true -> 그 항을 결과값에 더함.

3️⃣ 모든 항을 돌면서 true인 것만 골라서 다 더한 뒤 결과 리턴.

 

 

📌 다른 사람들 풀이

//1
import java.util.stream.IntStream;

class Solution {
    public int solution(int a, int d, boolean[] included) {
        return IntStream.range(0, included.length).map(idx -> included[idx]?a+(idx*d):0).sum();
    }
}

<-- 다른 풀이 요약 -->

- 1 : Stream 방식 : 간단하고 짧게 한 줄로 쓰고 싶을 때 (함수형이라 코드 짧고 깔끔함.)

항목  1번 (Stream) 내 코드
스타일 함수형 프로그래밍 절차지향 프로그래밍
반복 방식 IntStream.range() for (int i = 0; i < ... )
조건 분기 삼항 연산자 (? :) if 조건문
합산 방식 .sum() 으로 자동 합 answer += term 으로 수동 합
가독성 짧고 간결하지만 익숙하지 않으면 읽기 어려움 직관적이고 초보자에게 익숙함
유연성 조건 추가/변경이 조금 더 불편 수정/디버깅하기 쉬움



 

📌 새로 배운 문법

<-- 이번 문제에서 새로 배운 Java 문법 정리 -->

** Stream **

- IntStream.range(start, end)는 [start, end) (end는 포함 X)

목적  코드 예시  설명
인덱스 반복 IntStream.range(0, arr.length) 0부터 arr.length-1까지 반복 (end는 미포함)
배열 값 반복 Arrays.stream(arr) 배열의 요소를 스트림으로 처리
map (값 변형) .map(i -> i * 2) 각 값을 2배로 변형
filter (조건 걸기) .filter(i -> i % 2 == 0) 짝수만 남김
합계 .sum() 요소 전체의 합
곱셈 누적 .reduce((a, b) -> a * b).getAsInt() 전체 곱 계산
boolean 배열 true 개수 IntStream.range(0, arr.length).filter(i -> arr[i]).count() true 개수 세기
팩토리얼 IntStream.rangeClosed(1, n).reduce(1, (a, b) -> a * b) 1부터 n까지 곱

 

** 자주 쓰이는 수학 공식들 **

분류  공식  설명
등차수열 n번째 항 aₙ = a + (n - 1) × d 첫째항 a, 공차 d
등차수열 합 Sₙ = n × (2a + (n - 1) × d) / 2 앞 n개 합
등차수열 인덱스 i 항 a + i × d 0-based 인덱스로 쓸 때
1부터 n까지 합 n × (n + 1) / 2 기본 합 공식
1부터 n까지 제곱합 n × (n + 1) × (2n + 1) / 6 자주 등장
1부터 n까지 세제곱합 (n × (n + 1) / 2)² (합)²
팩토리얼 n! = n × (n-1) × ... × 1 스트림으로도 구현 가능
최대공약수 (GCD) gcd(a, b) = gcd(b, a % b) 유클리드 알고리즘
최소공배수 (LCM) lcm(a, b) = a × b / gcd(a, b) GCD를 활용
조합 nCr n! / (r! × (n - r)!) 순열/조합 계산 시

- 팩토리얼: int fact = IntStream.rangeClosed(1, n).reduce(1, (a, b) -> a * b);

int gcd(int a, int b) {					// 최대공약수
    return b == 0 ? a : gcd(b, a % b);
}

int lcm(int a, int b) {					// 최소공배수
    return a * b / gcd(a, b);
}

long comb(int n, int r) {				// 조합
    return fact(n) / (fact(r) * fact(n - r));
}

- 이 페이지 다시 정독하기..