본문 바로가기

알고리즘/SWEA

7510

 

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 초과에 대해서만 하면 된다.

'알고리즘 > SWEA' 카테고리의 다른 글

8016  (0) 2021.10.31
7810  (0) 2021.10.31
7991  (0) 2021.10.31
7988  (0) 2021.10.31
7985  (0) 2021.10.31