HwangHub

[Java/투포인터] 코드트리. 1이 k개 이상 존재하는 부분 수열 본문

workspace/알고리즘

[Java/투포인터] 코드트리. 1이 k개 이상 존재하는 부분 수열

HwangJerry 2024. 3. 29. 10:59

🤔 Intuition

명료하게 counting array를 이용하는 two pointer 문제이다.

🔎 Algorithm & Complexity

* @algorithm two pointer
* @time O(N) : two pointer -> 449 ms
* @memory O(N) : 42 MB

👨🏻‍💻 Logic

탐색할 때, 정답 갱신 조건과 탐색 종료 조건을 설정해주는 게 그나마 있는 출제 의도로 느껴졌다. 사실 체감상 단순 투포인터 템플릿을 이용하는 문제였다.

public class CodeTree_1이k개이상존재하는부분수열 {
    private static int[] arr;
    private static int[] cntarr = new int[3];
    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());
        arr = new int[n];

        st = new StringTokenizer(br.readLine());

        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        int j = 0;
        int min = (int) 1e9;
        cntarr[arr[0]]++;
        for (int i = 0; i < n; i++) {
            while (j + 1 < n && cntarr[1] < k) {
                cntarr[arr[++j]]++;
            }
            if (cntarr[1] >= k) {
                min = Math.min(j - i + 1, min);
            }
            if (j == n - 1) {
                break;
            }
            cntarr[arr[i]]--;
        }
        System.out.println(min == (int) 1e9 ? -1 : min);
    }
}
Comments