https://school.programmers.co.kr/learn/courses/30/lessons/12924#
연속된 자연수의 합이므로, 부분합을 응용했다.
1. 목표값보다 작으면 1씩 커지는 값을 더해주고
2. 목표값보다 커지면 더했던 값중 작은 값부터 1개씩 빼주었다.
class Solution {
public int solution(int n) {
int answer = 1;
int left = 0, right = 0, sum = 0;
while (right < n) {
// 숫자를 1씩 늘려가며 더해줌
sum += right++;
if (sum == n) answer++;
if (sum > n) {
// 자연수 n보다 커지면 작은 수부터 하나씩 빼줌
while (left < right && sum >= n) {
sum -= left++;
if (sum == n) answer++;
}
}
}
return answer;
}
}
다른 분의 풀이를 보니
수학도 공부해야하나보다...
위 정리에 맞게 다시 풀어보았다.
class Solution {
public int solution(int n) {
int answer = 0;
for (int i = 1; i <= n; i += 2) {
if (n % i == 0) answer++;
}
return answer;
}
}
'코딩테스트 > programmers' 카테고리의 다른 글
리코쳇 로봇 (0) | 2023.09.13 |
---|---|
하노이의 탑 (0) | 2023.09.12 |
이진 변환 반복하기 (0) | 2023.09.11 |
올바른 괄호 (0) | 2023.09.11 |
최솟값 만들기 (0) | 2023.09.07 |