백준/실랜디, 골랜디

[백준] C++ 부분합(1806)

2zreal 2025. 1. 8. 20:26

누적합, 투포인터 문제이다.

 

문제풀이방법

start와 end 포인터를 둬서 하나씩 이동시키면서 문제를 풀어야 한다.

start와 end를 -1로 초기화했다고 치자.

sum은 0이기 때문에 end를 오른쪽으로 한 칸 이동 키면서 sum+=arr[end]를 해준다.

구하고자 하는 값보다 sum이 작으면 end를 ++해주고 구하고자 하는 값보다 크면 start를 ++해줘서 sum-=arr[start]해준다.

 

#include <iostream>
#include <vector>

using namespace std;

vector<int> v;

int main(void)
{
	int N = 0;
	int S = 0;
	int start = -1;
	int end = -1;

	cin >> N >> S;

	for (int i = 0; i < N; i++)
	{
		int num = 0;
		cin >> num;
		v.push_back(num);
	}

	int len = 0;
	int sum = 0;
	int min = 987654321;

	while(true)
	{
		if (sum < S)
		{
			end += 1;
			if (end >= N)//만약 배열의 끝 범위를 넘어가면 멈춘다.
			{
				break;
			}
			len++;
			sum += v[end];
		}
		else
		{
			if (min > len)
			{
				min = len;
			}
			start += 1;
			len--;
			sum -= v[start];
		}

		if (start == end)//start와 end가 같아지면 가장 짧은거로 간주. 
		{
			min = 1;
			break;
		}
	}

	if (min == 987654321)
	{
		cout << 0;
	}
	else
	{
		cout << min;
	}
	
	return 0;
}

만약 start와 end가 같아지게 되면 그 값 하나만으로도 조건이 충족되기 때문에 min을 1로 만들고 break 한다.

min값이 아직 max값이면 어떠한 경우의 수도 조건을 충족하지 못하기 때문에 0을 출력한다.