제육's 휘발성 코딩
article thumbnail
Published 2022. 1. 19. 01:45
[Algorithm] 1806 - 부분합 (JAVA) 🔷 Java
반응형

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

 

1806번: 부분합

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

www.acmicpc.net


알고리즘 

부분합의 짧은 길이를 출력하는 문제로 이중 반복문을 사용하면 시간초과가 발생하며, 투포인터를 사용해야하는 문제이다.

start, end를 0으로 초기화한 후, end++를 해가며 sum의 값을 더한다. sum이 S보다 크면 길이를 측정하고, start를 end 전까지로 이동한다.


풀이

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

public class Main {
    static int start, end;
    static int N, S;
    static int[] arr;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        S = Integer.parseInt(st.nextToken());
        start = 0;
        end = 0;
        arr = new int[N+1];
        int answer = Integer.MAX_VALUE;
        int total = 0;
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) arr[i] = Integer.parseInt(st.nextToken());

        while (start <= N && end <= N) {
            if (total >= S && answer > end - start) answer = end - start;
            if (total < S) total += arr[end++];
            else total -= arr[start++];
        }
        if (answer == Integer.MAX_VALUE) System.out.println("0");
        else System.out.println(answer);
    }
}

 

반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^