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

 

1806번: 부분합

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

www.acmicpc.net

#문제 간단 정리

투 포인터를 활용하는 문제

많이 볼 수 있는 유형이라 많이 접근해봤다면 쉽게 풀 수 있다

#문제 해결 방법

우선 브루트 포스를 사용하면 

시간 초과가 날 것이 자명하기 때문에

 

값보다 작다면 end포인터를 ++ 하면서 길이를 늘리고

값보다 크다면 start 포인터를 -- 하면서 최소 길이를 확인합니다.

 

이는 가장 '짧은' 연속 부분합 길이를 찾는다고 문제에 나와있기 때문에

투 포인터를 사용해 조절해가며 길이를 찾는다는 아이디어를 생각 할 수 있습니다.

#전체 코드

#include <iostream>
#include <vector>
#include <climits>

using namespace std;

int main()
{
    int N, M;
    cin >> N >> M;
    vector<int> nums(N);
    for (int i = 0; i < N; i++) {
        cin >> nums[i];
    }

    int end = 0, start = 0,sum = 0;
    int minlength = INT_MAX;

    while (end < N) {

        if (sum < M) {
            sum += nums[end++];
        }
        while(sum >= M) {
            minlength = min(minlength, end - start);
            sum -= nums[start++];

        }
    }

    if (minlength == INT_MAX) minlength = 0;

    cout << minlength << '\n';
}

'[백준] > C++' 카테고리의 다른 글

백준 2644번 촌수계산 [C++]  (1) 2024.03.17
백준 2473번 세 용액 [C++]  (0) 2024.03.17
백준 20040번 사이클 게임 [C++]  (0) 2024.03.10
백준 2550번 전구 [C++]  (0) 2024.03.09
백준 1197번 최소 스패닝 트리 [C++]  (0) 2024.03.04

+ Recent posts