Algorithm

[Algorithm/Java][백준] 1806번 부분합

kkmin223 2022. 5. 18. 14:47
반응형

[BOJ] 1806번 부분합

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

문제 접근

투 포인터를 이용해서 문제를 풀었다.
deque와 이분 탐색을 이용해서도 풀 수 있다고 하는데 분류가 투 포인터라서 투 포인터를 사용해서 풀었다.
start와 end인 두 개의 인덱스를 사용하고 sum이 t(목표 값)보다 작거나 같으면 end를 +1해서 한개를 더 더하도록 하고, sum이 t(목표 값)보다 크면 start를 +1 해서 합에서 한개를 빼서 목표 값에 접근하도록 한다.
투 포인터를 사용하게 되면 O(N)으로 문제를 해결할 수 있게 되는 장점이 있다.

Code

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

public class BOJ1806 {
    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 t = 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 end = 0;
        int sum = arr[0];
        int answer = Integer.MAX_VALUE;
        while(start<=end){
            if(sum >= t){
                answer = Math.min(answer, end - start + 1);
            }
            if(sum <= t){
                end++;
                if(end == n) break;
                sum += arr[end];
            } else {
                sum -= arr[start];
                start++;
                if(start == n) break;
            }
        }
        if(answer == Integer.MAX_VALUE) System.out.println(0);
        else System.out.println(answer);
    }
}
반응형