Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
Tags
- 갭체크
- 자바스크립트
- 웹
- 연결 리스트
- 개발자루틴
- 알고리즘
- 오블완
- 프로그래밍 언어
- 데이터베이스
- 코딩테스트준비
- 자바
- 플로이드-워셜
- Java
- 코드트리
- 1일1코테
- 항해99
- 99클럽
- 코딩테스트
- 개발자취업
- 코테공부
- 인접 행렬
- #코드트리 #코딩테스트 #코테공부 #백트래킹 #알고리즘 기초
- 운영체제
- 코딩테스트사이트추천
- til
- 파이썬
- 자료구조
- 프로그래머스
- 티스토리챌린지
- C
Archives
- Today
- Total
와드의 블로그
숫자의 표현 본문
문제
자연수 n을 연속한 자연수들로 표현하는 방법의 수를 구하는 문제입니다. 예를 들어 15는 다음과 같이 4가지로 표현할 수 있습니다.
- 1 + 2 + 3 + 4 + 5 = 15
- 4 + 5 + 6 = 15
- 7 + 8 = 15
- 15 = 15
- 입력: 자연수 n (1 ≤ n ≤ 10,000)
- 출력: 연속된 자연수들로 n을 표현하는 방법의 수
링크: https://school.programmers.co.kr/learn/courses/30/lessons/12924
풀이 1: 등차수열의 합 공식을 이용한 완전 탐색
"i부터 j까지의 연속된 수의 합 = (첫 항 + 끝 항) * 항의 개수 / 2" 공식을 활용한 방식입니다.
- 이중 반복문: 시작 숫자 i를 1부터 n까지 설정하고, 끝 숫자 j를 i부터 n까지 순회합니다.
- 합 공식 검사: (j + i) * (j - i + 1) / 2 값이 n과 일치하면 카운트(ans++)합니다.
- 조기 종료 (가지치기): 만약 공식으로 계산한 합이 목표인 n보다 커졌다면, j를 더 늘려봤자 무조건 n을 초과하게 되므로 내부 반복문을 즉시 중단(break)합니다.
코드 1
class Solution {
public int solution(int n) {
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j++) {
int sum = (j + i) * (j - i + 1) / 2;
// 합이 정확히 n이면 방법의 수 증가
if (sum == n) {
ans++;
break; // 더 이상 확인할 필요 없으므로 중단
}
// 합이 n을 초과하면 더 이상 탐색하는 것이 무의미하므로 조기 종료
else if (sum > n) {
break;
}
}
}
return ans;
}
}
풀이 2: 투 포인터 (Two Pointers)를 활용한 O(N) 탐색
시작점(left)과 끝점(right)을 두고, 부분 수열의 합(sum)이 목표값 n보다 작으면 오른쪽으로 구간을 늘리고, 크면 왼쪽 구간을 줄여나가는 슬라이딩 윈도우/투 포인터 방식입니다.
- 배열 전체를 O(N)에 한 번만 훑기 때문에 속도가 매우 빠르고 직관적입니다.
코드 2
class Solution {
public int solution(int n) {
int ans = 0;
int left = 1, right = 1, sum = 1;
while (left <= n) {
// 합이 n과 같으면 카운트 증가
if (sum == n) {
ans++;
}
// 합이 n보다 작거나 같으면 오른쪽으로 구간 확장
if (sum <= n) {
right++;
sum += right;
}
// 합이 n보다 크면 왼쪽 구간을 빼주면서 축소
else {
sum -= left;
left++;
}
}
return ans;
}
}
알고리즘 분류
완전 탐색 (Brute Force), 투 포인터 (Two Pointers), 수학 (Mathematics)
'PS > 프로그래머스' 카테고리의 다른 글
| 점프와 순간 이동 (0) | 2026.04.24 |
|---|---|
| 다음 큰 숫자 (0) | 2026.04.23 |
| 이진 변환 반복하기 (0) | 2026.04.23 |
| JadenCase 문자열 만들기 (0) | 2026.04.23 |
| 연속된 부분 수열의 합 (0) | 2026.04.21 |