n이 굉장히 크고, 중복처리된 연속적인 수이다.
문제 내용대로 15가 나올수 있는 경우는 아래의 4가지이다.
슬라이딩 윈도우식으로 나온다.
vector만들어서 하는것은 메모리 낭비라고 생각함.
sum 여부에 따라서 어떻게 할지를 결정함.
1) rPos를 ++하면서 sum에 더하고,
2) n보다 sum 작다고 한다면 rPos 이동하면서 누적
3) n보다 sum이 크면 누적 중단하고, sum에서 lPos를 차감하고, lPos를 증가(이동)
4) n이 sum과 동일하다고 하면 answer++ 하고, 완료가 되었으니, 이전상태인 필요없는 lPos를 제거하고, 증가하는 식으로 진행하자.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
int n;
cin >> n;
// 연속된 숫자를 가지고 진행하자.
// 슬라이딩 윈도우 식의 형태이므로 이를 표현하자.
// sum이 동일하면 lPos 오른쪽으로,
// sum이 크면 lPos 오른쪽으로
// sum이 작다면 rPos를 오른쪽으로
// 누적하는 거는 rPos로 진행
// rPos가 자기값 나오면 끝마치자.
int lPos = 1;
int rPos = 1;
int answer = 0;
int sum = 1;
while (rPos <= n)
{
if (sum == n)
{
answer++;
sum -= lPos;
lPos++;
}
else if (sum > n)
{
sum -= lPos;
lPos++;
}
else if (sum < n)
{
rPos++;
sum += rPos;
}
}
// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// 1 2 3 4 5 / 4 5 6 / 7 8 / 15
cout << answer << endl;
return 0;
}