[백준 1806] 부분합(Java)

최민길(Gale)·2023년 9월 18일
1

알고리즘

목록 보기
133/172

문제 링크 : https://www.acmicpc.net/problem/1806

이 문제는 투 포인터를 이용하여 풀 수 있습니다. 연속된 수의 부분합 중 가장 짧은 길이를 구하는 문제이기 때문에 입력 배열을 정렬하지 않으며 탐색합니다. 부분합 중 가장 짧은 길이는 시작 인덱스와 끝 인덱스의 차에 1을 더한 값과 같기 때문에 합이 S보다 크거나 같을 경우 길이값의 최솟값을 갱신하고 투 포인터로 탐색을 진행합니다.

다음은 코드입니다.

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

class Main{
    static int N;
    static long S;
    static int[] A;
    static int res = Integer.MAX_VALUE;

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        S = Integer.parseInt(st.nextToken());
        A = new int[N];
        st = new StringTokenizer(br.readLine());
        for(int i=0;i<N;i++) A[i] = Integer.parseInt(st.nextToken());
        getSum(0,0,A[0]);
        if(res == Integer.MAX_VALUE) System.out.println(0);
        else System.out.println(res);
    }

    static void getSum(int s, int e, long sum){
        if(e >= N || s >= N) return;

        if(sum >= S){
            res = Math.min(res, e-s+1);
            getSum(s+1,e,sum-A[s]);
        }
        else{
            if(e+1<N) getSum(s,e+1,sum+A[e+1]);
        }
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글