알고리즘

백준 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);
    }
}