PS/Baekjoon Online Judge

[백준 1806] 부분합 [C]

kimyoungrok 2021. 8. 25. 04:51

백준 - 1806


풀이

연속된 수들의 부분합이기 때문에 Two Pointers로 쉽게 구현할 수 있다.

 

start, end가 가르키는 배열의 합들이 S이상이면 최소 길이를 구해야 하며, 만약 sum이 S보다 작으면 end+1번째 요소를 더해주고, 그렇지 않다면 start번째 요소를 빼주는 방식으로 풀이했다.


소스코드

#include <stdio.h>
#define min(a, b) a < b ? a : b
int main(){
    int arr[100000], N, S, start = 0, end = 0;
    scanf("%d %d %d", &N, &S, &arr[0]);
    for (int i = 1; i < N; i++)
        scanf("%d", &arr[i]);	
	
    int cnt = 1e5, sum = arr[0];
    while (start <= end && end < N){
        if (sum >= S)
            cnt = min(cnt, end - start + 1); 
        sum += (sum < S ? arr[++end] : -arr[start++]);
    }
    printf("%d", cnt == 1e5 ? 0 : cnt);
}

출처

 

1806번: 부분합

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

www.acmicpc.net

'PS > Baekjoon Online Judge' 카테고리의 다른 글

[백준 1005] ACM Craft [C]  (0) 2021.08.25
[백준 2239] 스도쿠 [C]  (0) 2021.08.25
[백준 2166] 다각형의 면적 [C]  (0) 2021.08.25
[백준 11758] CCW [C]  (0) 2021.08.25
[백준 9527] 1의 개수 세기 [C]  (0) 2021.08.25