
알고리즘 분류 : 투 포인터
난이도 : 실버1
출처 : 백준 - 귀여운 라이언


투포인터를 이용해 f부터 b까지의 1의 갯수를 구한다.
1의 갯수가 K보다 작은경우 b++, K와 같을 경우 f++를 한다.
1의 갯수가 K와 같은 경우 중 b와 f사이의 거리가 최소인 경우를 구한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
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 K = 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 f = 0, b = 0, cnt = 0;
int min=Integer.MAX_VALUE;
if(arr[0]==1) {
cnt=1;
}
while(b!=N) {
if(cnt==K)
min = Math.min(min, b-f+1);
if(b==f || cnt<K) {
b++;
if(b==N)
break;
else if(arr[b]==1)
cnt++;
}
else {
if(arr[f]==1)
cnt--;
f++;
}
}
System.out.println(min==Integer.MAX_VALUE?-1:min);
}
}

두개의 포인터가 0에서부터 시작하는 투포인터 문제다.