프로그래머스 연속된 수의 합 풀이
케이스 분기를 등차수열 식 한 줄로 접기
total이 num으로 나눠떨어지는 경우와 아닌 경우로 갈라 풀다 루프 변수 추적이 꼬였다. 필요한 값이 첫 항 하나뿐이라는 걸 알고 분기를 통째로 없앤 과정.
“연속된 수의 합”은 케이스를 나눠 풀면 코드가 계속 불어나고, 식으로 접으면 한 줄로 끝나는 문제다. 이 글에서는 그 두 접근 사이에서 헤맨 과정을 이야기하려 한다 — 처음의 케이스 분기 풀이가 왜 꼬였는지(트러블슈팅), 그리고 등차수열 합에서 첫 항을 유도해 분기를 없앤 최종 구현이다.
프로그래머스 — 연속된 수의 합
처음에는 문제를 등차수열 합으로 바로 변환하지 못하고, total이 num으로 나눠떨어지는 경우/안 떨어지는 경우로 케이스를 나눠서 접근했다. 그러다 보니 루프 내부 변수(count) 갱신 흐름이 불명확해져 시작값 추적이 어려워졌고, 복잡도만 올라갔다. 공식을 떠올리긴 했는데, 그걸 식으로 고정해 단일 로직으로 정리하는 단계가 늦었던 게 문제였다.
결국 필요한 값은 첫 항(start) 하나뿐이라는 걸 깨닫고 식을 유도했다.
1
2
3
4
5
6
7
8
9
10
11
12
연속된 num개 수를
start, start+1, ..., start+(num-1)
라고 두면,
합 = num*start + num*(num-1)/2 = total
따라서
start = (total - num*(num-1)/2) / num
코드에서 자주 쓰는 동치 형태:
start = total/num - (num-1)/2
(이 문제는 항상 해가 존재한다고 보장)
이 식 하나로 분기가 전부 사라졌다.
1
2
3
4
5
6
7
8
9
vector<int> solution(int num, int total) {
vector<int> answer;
int start = total / num - (num - 1) / 2;
for (int i = 0; i < num; i++) {
answer.push_back(start + i);
}
return answer;
}
여기서 얻은 교훈은 세 가지다. 문제 해석 직후 “필요한 값은 무엇인가”로 목표를 축소할 것(이 문제는 start 1개), 케이스 분기 대신 단일 공식으로 처리해 조건 누락/중복 로직 같은 구현 실수를 줄일 것, 그리고 검증 루틴을 고정할 것 — 짝수 num / 홀수 num / 음수 포함 케이스를 최소 3개 대입해 확인한다.
복습 체크리스트:
- 등차수열 합 공식에서 start를 직접 유도해 종이에 1회 정리
- 같은 패턴 문제 1개를 분기 없이 단일 식으로 구현
- 루프 변수는 start+i 형태로 단순화하는 습관 유지
같은 날 함께 푼 기본 연산·수열 카타와 CodeKata 링크 정리는 이 글의 주제와 달라 덜어냈다. 풀이 코드는 CodeKata 08에 정리돼 있다.
핵심 요약 — 연속된 수의 합은 케이스 분기 대신 등차수열 합에서 첫 항을 유도한 식
start = total/num - (num-1)/2하나로 정리된다. 문제 해석 직후 “필요한 값이 무엇인가”로 목표를 축소하면 구현이 단순해진다.