static queue<int> q;
static int solution(void)
{
int N, sum = 0, ret = 0, mid;
cin >> N;
mid = N / 2 + 1;
for (int i = 1; i <= mid; i++)
{
sum += i;
q.push(i);
if (sum == N)
ret += 1;
else if (sum > N)
{
while (sum > N && !q.empty())
{
sum -= q.front();
q.pop();
}
if (sum == N)
ret += 1;
}
}
while (!q.empty())
q.pop();
if (N > 1)
ret += 1;
return ret;
}
어떤 수를 연속된 자연수의 합으로 표현 한다면 그 개수가 몇개인지를 구하는 문제이다.
예를들어, 47이 있으면 47 = 23 + 24로 표현 되고, 두수는 연속적이다는 것을 알 수 있다.
그래서 1 부터 차례대로 더해가면서 찾게되는데, N/2 + 1까지만 하면 된다. 위 경우를 생각해보면 된다.
그래서 쭉 더해 나가다가 주어진 값을 초과하게되면 1 부터 차례대로 빼야한다.
마지막 if 문은 47 자체도 하나의 경우가 되기 때문에 이를 고려한 것이다.
1의 경우는 for문에서 걸러지기 때문에 1 초과에 대해서만 하면 된다.