🙅♀️ 시초 난 코드
import java.util.*; import java.io.*; public class Main { public static void main(String[] args) throws Exception{ 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 answer = 0; for(int size=K;size<N;size++){ int lion = 0; for(int i=0;i<size;i++){ if(arr[i]==1) lion++; } if(lion>=K){ System.out.println(size); System.exit(0); } else{ for(int next=size;next<N;next++){ if(arr[next]==1) lion++; if(arr[next-size]==1) lion--; if(lion>=K){ System.out.println(size); System.exit(0); } } } } } }
🙆 정답 코드
import java.util.*; import java.io.*; public class Main { public static void main(String[] args) throws Exception{ 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()); int answer = 0; ArrayList<Integer> list = new ArrayList<>(); for(int i=0;i<N;i++){ arr[i] = Integer.parseInt(st.nextToken()); if(arr[i]==1) list.add(i); } int start = 0,end=K-1; int min = Integer.MAX_VALUE, cnt=0; if(list.size()<K){ System.out.println(-1); } else{ while(true){ if(end==list.size()) break; cnt = list.get(end)-list.get(start)+1; min = Math.min(min,cnt); start++; end++; } System.out.println(min); } } }
- 예제 입력이 이렇다고 하자.
10 3 1 2 2 2 1 2 1 2 2 1
- 그렇다면 ArrayList에 저장되는 값은 [0,4,6,9] 일 것이다.
- while문을 보자.
int start =0, end= K-1
로 초기값을 설정했는데, 만약에 예제 입력처럼 K=3 으로 라이언이 최소 3개 포함되어야 한다고 하자. ArrayList의 Index는 0부터 시작하므로,end=K-1
로 해주어야 집합의 크기를 구할 때, 즉cnt= list.get(end)-list.get(start)+1
의 식이 성립할 수 있게 된다.- start, end를 1씩 늘리면서, end가 list 끝까지 도달하면 while문을 탈출한다. 이 부분이 투포인터!
- 그리고
min = Math.min(min,cnt)
로, 해당 집합의 크기가 최소인지 계속 비교한다.