(260604)2018 수들의 합.

·2024년 1월 9일

백준 알고리즘

목록 보기
143/350

풀이 전략

  • 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;
}
profile
🔥🔥🔥

0개의 댓글