[투포인터] BOJ_1806 부분합 "JAVA"

라리·2021년 10월 16일
0

코딩테스트

목록 보기
26/29

🚀링크

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

💻문제

🌏문제풀이

👩‍💻코드

package javaTest;

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

public class BOJ_1806 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		int min = Integer.MAX_VALUE;
		int start = 0;
		int end = 0;
		int sum = 0;
		boolean flag = true;
		
		st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int S = Integer.parseInt(st.nextToken());
		int[] numbers = new int[N];
		
		st = new StringTokenizer(br.readLine());
		for(int i=0; i<N; i++) {
			numbers[i] = Integer.parseInt(st.nextToken());
		}
		
		sum = numbers[0];
		while(start < N) {
			//합이 S보다 크거나 end가 끝까지 간 경우
			if(sum >= S || end == N-1) {
				if(sum >= S) {//이 중 합이 S보다 큰경우에만 MIN을 구함
					min = Math.min(min, end-start+1);
					flag = false;
				}//START를 한칸 옮겨주고 SUM에서는 빼준다
				sum -= numbers[start++];
				//System.out.println("2. "+start + " " + end + " " + sum + " " + min);
			}else {//그 외는 END를 한칸 옮겨준 다음 SUM에 합해준다
				sum += numbers[++end];
				//System.out.println("1. "+start + " " + end + " " + sum);
			}
		}
		
		if(flag)//sum >= S인 경우가 없을 때는 0을 출력
			min = 0;
		System.out.println(min);
		
		br.close();
	}

}

0개의 댓글