[백준] 부분 합 c++ (1806번)

2025. 7. 3. 14:16코딩테스트

부분합

한국어   
시간 제한메모리 제한제출정답맞힌 사람정답 비율
0.5 초  128 MB 126685 35914 25335 26.601%

문제

10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.

출력

첫째 줄에 구하고자 하는 최소의 길이를 출력한다. 만일 그러한 합을 만드는 것이 불가능하다면 0을 출력하면 된다.


문제 해결 방법

연속된 부분의 합을 체크 하기 위해서는 투 포인터 방식을 이용

합이 작다면 end 인덱스의 값을 증가시키고, 합이 크다면 start 인덱스를 증가시키면서 최소 길이를 갱신한다.

#include <iostream>

using namespace std;

int N, S;
int Arr[100001];

int main()
{
	cin >> N >> S;

	int start = 0;
	int end = 0;
	int minLength = N + 1;
	int sum = 0;

	for (int i = 1; i <= N; i++)
	{
		cin >> Arr[i];
	}

	while (true)
	{
		//합이 S값보다 크거나 같은 경우 기존에 저장해두었던 최소길이와 비교하고, start 인덱스를 증가시킴(더 짧은 길이가 있는지 체크)
		if (sum >= S)
		{
			minLength = min(minLength, end - start);
			sum -= Arr[start];
			start++;
		}
		else if (end == N)
		{
			break;
		}
		else
		{
			//합이 S값보다 작은경우 end 인덱스를 증가시킴
			end++;
			sum += Arr[end];
		}
	}

	if (minLength == N + 1)
	{
		cout << 0;
	}
	else
	{
		//출력시 길이에 +1을 해야함
		cout << minLength + 1;
	}
}

https://www.acmicpc.net/problem/1806

 

'코딩테스트' 카테고리의 다른 글

[백준] 단어 수학 c++ (1339번)  (0) 2025.07.07
[백준] 30 c++ (10610번)  (0) 2025.07.04
[백준] N과 M (1) c++ (15649번)  (1) 2025.06.28
[백준] 숫자 카드 2 c++ (10816번)  (0) 2025.06.28
[백준] 신입 사원 c++ (1946번)  (1) 2025.06.23