알고리즘/백준

[백준 1806] 부분합 C++

겜도리도리 2021. 10. 25. 23:42
반응형

문제

백준 1806 부분합 C++

 

1806번: 부분합

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

www.acmicpc.net

풀이

슬라이딩 포인터 (두 포인터)를 사용합니다.

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <algorithm>
using namespace std;
 
int arr[100000];
int main()
{
    int N, S;
    cin >> N >> S;
    for (int i = 0; i < N; i++) {
        cin >> arr[i];
    }
    int right = 0;
    int left = 0;
    int sum = arr[0];
    int minlength = 987654321;
    while (1) {
        // 범위 벗어나면 끝
        if (left > right || right >= N) {
            break;
        }
        // 합이 크면 왼쪽 최소길이 갱신하고 움직이기
        if (sum >= S) {
            int length = right - left + 1;
            minlength = min(minlength, length);
            sum -= arr[left];
            left++;
        }
        // 합이 작으면 오른쪽 움직이기
        else {
            right++;
            sum += arr[right];
        }
    }
    // 조건 만족할 수 없으면 0
    if (minlength == 987654321) {
        minlength = 0;
    }
    cout << minlength;
    return 0;
}
cs
반응형

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

[백준 17144] 미세먼지 안녕! C++  (0) 2021.10.29
[백준 1707] 이분 그래프 C++  (0) 2021.10.26
[백준 3055] 탈출 C++  (0) 2021.10.21
[백준 1197] 최소 스패닝 트리 C++  (0) 2021.10.20
[백준 1520] 내리막 길 C++  (0) 2021.10.17