Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
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
Archives
Today
Total
관리 메뉴

hwooo

BOJ (Java) 1806번: 부분합 본문

Study/Algorithm

BOJ (Java) 1806번: 부분합

hwooo 2025. 6. 24. 11:51

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


풀이

입력은 모두 자연수이므로 수를 더할 수록 값은 커지기만 한다.

또한 연속된 수열의 합이므로 주어진 배열의 순서를 바꾸면 안 된다.

투 포인터를 활용, end 인덱스를 늘려주며 부분합을 구하다가 합이 S가 넘으면 start 인덱스를 증가시키며 S가 넘는 부분합의 최소 길이를 찾는다.


Java 코드

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

public class Main {
    private static int N, S;
    private static int[] nums;
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String[] inputs = bf.readLine().split(" ");

        N = Integer.parseInt(inputs[0]);
        S = Integer.parseInt(inputs[1]);

        inputs = bf.readLine().split(" ");
        nums = new int[N];
        for (int i = 0; i < N; i++) {
            nums[i] = Integer.parseInt(inputs[i]);
        }

        int minLen = N + 1;
        int start = 0;
        int sum = 0;
        for (int i = 0; i < N; i++) {
            sum += nums[i];
            
            // 합이 S가 넘었을 때 S가 넘는 최소 길이 구하기
            if (S <= sum) {
                while (S <= sum - nums[start]) {
                    sum -= nums[start];
                    start++;
                }
                
                // 최소 길이 갱신
                minLen = Math.min(minLen, i - start + 1);
            }
        }
        
        // 가능하지 않으면 0
        if (minLen > N)
            minLen = 0;
        
        System.out.println(minLen);
    }
}

'Study > Algorithm' 카테고리의 다른 글

BOJ (Java) 16234번: 인구 이동  (0) 2025.07.03
BOJ (Java) 13913번: 숨바꼭질 4  (1) 2025.06.26
BOJ (Java) 1946번: 신입 사원  (1) 2025.06.14
BOJ (Java) 2638번: 치즈  (0) 2025.06.10
BOJ (Java) 16940번: BFS 스페셜 저지  (0) 2025.06.04