백준 1806 부분합 자바

꾸준하게 달리기~·2023년 7월 31일
0
post-thumbnail

문제는 다음과 같다.
https://www.acmicpc.net/problem/1806

풀이는 다음과 같다.

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st1 = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st1.nextToken());
        int S = Integer.parseInt(st1.nextToken());

        int[] arr = new int[N];
        int min = Integer.MAX_VALUE;

        StringTokenizer st2 = new StringTokenizer(br.readLine());
        for(int i = 0 ; i < N ; i++) {
            arr[i] = Integer.parseInt(st2.nextToken());
        }

        int s = 0;
        int e = 0;

        int sum = 0;

        while(true) {

            if(sum >= S) {
                min = Math.min(min, e-s);
                sum -= arr[s];
                s++;

            }
            else if(e == N) { // e==N이더래도, sum >= S라면 위에서 계속 s 줄여나가기 가능. (e 마지막 index가고도 있을법한 상황 위해)
                break;
            }
            else {
                sum += arr[e];
                e++;
            }

        }



        if(min == Integer.MAX_VALUE) {
            bw.write(String.valueOf(0));
        }
        else {
            bw.write(String.valueOf(min));
        }
        bw.flush();
        bw.close();
    }

}

흔한 투포인터 문제인데, 가운데의 else if 문 정도만 이해한다면
문제는 쉽다.

가운데의 else if문은, end 포인터가
끝에 도달하고 나서 sum >= S라면,
sum < S가 될때까지 start포인터를 줄여나가기 위해
만들어준 로직이다.

잘 생각해보자. Math.min을 사용하는 투포인터 문제라면,
위처럼 if문에서 최솟값 갱신 시도 로직이 먼저 나와야 한다.
min = Math.min(min, e-s);

그래야지만 e가 끝까지 간 후에도,
s를 더 줄일 수 있다면 계속해서 줄여주는 로직이 가능하기 때문이다.

profile
반갑습니다~! 좋은하루 보내세요 :)

0개의 댓글