프로그래머스 120831 - 짝수의 합 (Lv.0)
핵심 접근 — 짝수 개수 half = n/2로 접어 half(half+1) 닫힌 식
프로그래머스 120831 - 짝수의 합 (Lv.0)
출처: https://school.programmers.co.kr/learn/courses/30/lessons/120831
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 프로그래머스 120831 - 짝수의 합 (Lv.0)
// https://school.programmers.co.kr/learn/courses/30/lessons/120831
// 문제 설명
// 정수 n이 주어질 때, n 이하의 짝수를 모두 더한 값을 반환하라.
// 제약 조건
// 0 < n <= 1000
// Example
// Input : n = 10
// Output: 30 (2 + 4 + 6 + 8 + 10)
//
// Input : n = 4
// Output: 6 (2 + 4)
// 접근 — 개수부터 세고 가우스 합으로 접기
// 더할 항을 나열하면 2, 4, 6, ..., 2k 형태의 등차수열이다. 루프로 훑어도 n <= 1000이라
// 통과하지만, 항의 "개수"만 알면 덧셈 자체를 없앨 수 있다.
// 1) n 이하 짝수의 개수 half = n / 2 (정수 나눗셈의 내림이 그대로 답 — n이 홀수여도 맞다).
// n = 5면 half = 2, 짝수는 2와 4 두 개.
// 2) 합 = 2 + 4 + ... + 2*half = 2 * (1 + 2 + ... + half)
// = 2 * half(half + 1) / 2 = half(half + 1).
// 3) 나눗셈 한 번, 곱셈 한 번으로 끝 — 반복문이 사라진다.
// 시간 O(1), 공간 O(1)
int solution(int n) {
int half = n / 2; // n 이하 짝수는 2, 4, ..., 2*half — 개수 = n/2 (내림)
return half * (half + 1); // 2*(1+2+...+half) = 2 * half(half+1)/2 = half(half+1)
}
정리
- “몇 개인지”를 먼저 세면 덧셈이 곱셈으로 바뀐다. 등차수열 합 문제의 공통 골격이다 — 항을 나열하지 말고 개수
half를 구한 뒤 가우스 합half(half+1)/2에 공차 2를 곱한다. 여기서는 2를 곱하면서/2가 상쇄돼half(half+1)이라는 나눗셈 없는 식이 남는다. - 내림 나눗셈이 홀짝 분기를 흡수한다.
n / 2는 n이 홀수면 자동으로 마지막 홀수를 버리므로if (n % 2)같은 분기가 필요 없다. 정수 나눗셈의 내림을 “조건문 대신 쓰는” 패턴. - 상한 점검: n = 1000일 때 half = 500 → 500 × 501 = 250,500. int로 여유롭다. 다만 이 식은 제약이 커지면 바로 넘친다 — n이 10억이면 half ≈ 5억, 곱은 약 2.5 × 10^17로
long long이 필수다. 곱셈 문제는 누적 상한부터 계산하고 자료형을 정하는 습관(12949 행렬의 곱셈에서 굳힌 것)이 여기서도 그대로 적용된다. - O(n) 루프와 O(1) 식의 차이가 드러나는 지점은 제약이 커질 때다. n ≤ 1000이면 루프도 즉시 끝나지만, 같은 문제가 “n ≤ 10^18”로 나오면 루프는 애초에 불가능하고 식만 남는다. 제약이 작을 때 식으로 푸는 연습이 그 대비다.
- 검증: 예제 2개(30, 6)와 경계값 n = 1(→ 0)에 더해, 1부터 1000까지 전 구간을 루프 브루트포스와 대조해 전부 일치 (MSVC
/std:c++17 /utf-8컴파일·실행, n = 1000 → 250500).
핵심 요약 — 등차수열 합은 항을 나열하지 말고 개수부터 센다.
half = n / 2의 내림이 홀짝 분기를 대신하고, 가우스 합에 공차 2를 곱하면/2가 상쇄돼half(half+1)한 줄이 남는다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.