문제
https://www.acmicpc.net/problem/2018
2018번: 수들의 합 5
어떠한 자연수 N은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 N(1 ≤ N ≤ 10,000,000)에 대해서, 이 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 알고 싶어한
www.acmicpc.net
문제 요약
자연수 n을 연속된 자연수들의 합으로 나타내는 가지수를 출력한다.
이 때, 사용하는 자연수는 n이하이다.
ex) 15를 나타내는 방법
15 = 7 + 8 = 4 + 5 + 6 = 1 + 2 + 3 + 4 + 5
코드
#include <iostream>
using namespace std;
int n;
int main() {
cin >> n;
int left = 0;
int right = 0;
int sum = 0;
int cnt = 0;
while (right <= n) {
if (sum == n) {
cnt++;
right++;
sum += right;
}
else if (sum < n) {
right++;
sum += right;
}
else {
sum -= left;
left++;
}
}
cout << cnt;
}
코드 설명
투포인터 알고리즘을 이용한다.
0부터 n까지 1씩 증가하는 배열이 존재한다고 가정한다.
(실제로는 left와 right 내용 자체가 가리키는 배열의 위치이다. 즉, 배열이 필요없다.)
left, right 포인터 두 개를 자연수 0에 두고, 포인터 사이에 존재하는 자연수들의 합(sum)이
1. n보다 작으면, 오른쪽 포인터를 오른쪽으로 한 칸 옮기고
2. n보다 크면, 왼쪽 포인터를 오른쪽으로 한 칸 옮기고
3. n과 같으면, cnt를 1씩 증가시키고 오른쪽 포인터를 오른쪽으로 한 칸 옮긴다.
right 포인터가 n을 넘어가면 종료한다.
마지막으로 cnt의 개수를 출력한다.
'Algorithm Problems > 투 포인터' 카테고리의 다른 글
[백준/C++] 9020번: 골드바흐의 추측 (1) | 2024.09.10 |
---|---|
[백준/C++] 15565번: 귀여운 라이언 (0) | 2024.03.26 |
[백준/C++] 7453번: 합이 0인 네 정수 (0) | 2024.03.20 |
[백준/Python] 2470번: 두 용액 (1) | 2023.11.08 |
[백준/Python] 1644번: 소수의 연속합 (2) | 2023.11.07 |