알고리즘/문제풀이

[백준/BOJ] 1806 부분합 - JAVA

LIRI 2025. 6. 11. 18:08

[백준/BOJ] 1806 부분합 - JAVA

문제

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

 

문제 분석

조건

10,000개 이상의 자연수로 이루어진 수열에서, 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 문제

풀이방법

투 포인터(슬라이딩 윈도우)를 활용하여 문제를 풀었다. `end`포인터를 한칸씩 옮기며 구간 합을 계산하였고, 조건이 만족했을 때 start를 옮기며 최소 길이를 비교하였다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int S = Integer.parseInt(st.nextToken());
        int[] arr = new int[N];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        int start = 0;
        int sum = 0;
        int answer = N + 1;

        // end 포인터가 배열의 끝까지 이동
        for (int end = 0; end < N; end++) {
            sum += arr[end];
            while (sum >= S) {
                answer = Math.min(answer, end - start + 1);
                sum -= arr[start];
                start++;
            }
        }
        if (answer == N + 1) {
            System.out.println(0);
        } else {
            System.out.println(answer);
        }
    }
}
728x90