Day5 - 등차수열의 특정한 항만 더하기
📌 문제 정보
- 문제 이름 : 코딩 기초 테스트 - 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));
}
- 이 페이지 다시 정독하기..