문제는 다음과 같다.
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를 더 줄일 수 있다면 계속해서 줄여주는 로직이 가능하기 때문이다.