알고리즘
백준 14465번 소가 길을 건너간 이유5 (JAVA)
박카스마시며코딩
2022. 3. 17. 16:15
https://www.acmicpc.net/problem/14465
14465번: 소가 길을 건너간 이유 5
첫 줄에 N, K, B (1 ≤ B,K ≤ N)가 주어진다. 그 다음 B줄에는 고장난 신호등의 번호가 하나씩 주어진다.
www.acmicpc.net
저는 슬라이딩 윈도우 개념을 이용해 문제를 해결하였습니다.
boolean배열을 통해 에러 지점을 확인하고 for문으로 true면 cnt값을 늘리고 i-k이 true면 cnt값을 줄이면서 result와 cnt를 비교해 문제를 해결하였습니다.
package BOJ.TwoPoint;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_14465 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(st.nextToken());
int k = stoi.apply(st.nextToken());
int m = stoi.apply(st.nextToken());
int[] errorPoint = new int[m];
boolean[] error = new boolean[n+1];
for(int i = 0 ; i < m ; i++){
int num = stoi.apply(br.readLine());
error[num] = true;
}
Arrays.sort(errorPoint);
int si = 0;
int ei = 0;
int result = n;
int cnt = 0;
for(int i = 1 ; i <= n; i++){
if(error[i]){
cnt++;
}
if(i > k){
if(error[i-k]){
cnt--;
}
}
if(i >= k){
result = Math.min(result,cnt);
}
// System.out.println(i+" "+result);
}
System.out.println(result);
}
}