BOJ 1806 부분합 [Java]

AMUD·2022년 1월 23일
0

Algorithm

목록 보기
4/78
post-thumbnail

문제

BOJ 1806 부분합

접근 방법

  • 슬라이딩 윈도우, 투포인터 개념을 알고 있다면 크게 어렵지 않
  • 을 줄 알았는데 break 조건에서 애를 먹었다.
  • else if일 때는 맞고, if로 넣으면 틀리다. 생각할 때 어쩌면 if가 더 맞다고 생각했는데 아주 어렴풋이 end는 커지더라도, start 부분에서 계속 변화가 있을 수도 있겠다는 생각이 들어서 else if로 넣었더니 된다..
  • 다음 문제에서는 더 명확하게 로직을 짜보도록 하자
  • 좀 더 구체적인 조건을 설명하자면

    연속합이 기준보다 작으면? end를 늘려서 더해지는 수의 개수를 추가한다.
    연속합이 기준 이상이면? 조건 만족을 처리하고, 다음 비교를 위해 start를 다음 칸!

구현

import java.io.*;
import java.util.*;

// 연속된 수들의 부분합

class Main {
    static int N, S, start, end, min, sum; // N은 원소 개수, S는 기준합
    static int[] nums;

    public static void main(String[] arg) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ", false);

        N = Integer.parseInt(st.nextToken());
        S = Integer.parseInt(st.nextToken());
        nums = new int[N];

        st = new StringTokenizer(br.readLine(), " ", false);
        for (int i = 0; i < N; i++)
            nums[i] = Integer.parseInt(st.nextToken());

        start = 0;
        end = 0;
        min = 0;
        sum = 0;
        while(true) {
            if (sum >= S) {
                sum -= nums[start];
                if ( min == 0 ) min = end - start;
                else min = Math.min(min, end-start);
                start++;
            }
            else if (end == N) break;
            else {
                sum += nums[end];
                end++;
            }
        }

        System.out.print(min + "");
    }
}

제출

profile
210's Velog :: Ambition Makes Us Diligent

0개의 댓글