[백준] BOJ_1806 부분합 JAVA

최진민·2021년 4월 6일
1

Algorithm_BOJ

목록 보기
77/92
post-thumbnail

BOJ_1806 부분합

문제

10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오.


입력

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


출력

첫째 줄에 구하고자 하는 최소의 길이를 출력한다. 만일 그러한 합을 만드는 것이 불가능하다면 0을 출력하면 된다.


예제 입&출력


소스코드

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

public class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer 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 first = 0;
        int second = 0;

        int sum = 0;
        int ans = n;

        while (true) {

            if (sum >= s) {
                sum -= arr[first++];
                ans = Math.min(ans, second - first);
            } else if (second == n) break;
            else {
                sum += arr[second++];
            }
        }

        if (ans == n) {
            System.out.println(0);
        } else System.out.println(ans + 1);

    }
}

Comment

  • 투 포인터 문제 유형 중, 포인터 2개를 첫 인덱스부터 시작하는 문제.
  • 💥알지 못할 문제점 아래코드 2가지의 경우 답이 다르게 나온다...
        while (true) {

            if (sum >= s) {
                sum -= arr[first++];
                ans = Math.min(ans, second - first);
            } else if (second == n) break;
            else {
                sum += arr[second++];
            }
        }
        while (true) {

            if (sum < s) {
                sum += arr[second++];
            } else if (second == n) break;
            else {
                sum -= arr[first++];
                ans = Math.min(ans, second - first);
            }
        }

profile
열심히 해보자9999

0개의 댓글