알고리즘

백준 20922번 겹치는 건 싫어(JAVA)

박카스마시며코딩 2024. 1. 6. 22:22

https://www.acmicpc.net/problem/20922

 

20922번: 겹치는 건 싫어

홍대병에 걸린 도현이는 겹치는 것을 매우 싫어한다. 특히 수열에서 같은 원소가 여러 개 들어 있는 수열을 싫어한다. 도현이를 위해 같은 원소가 $K$개 이하로 들어 있는 최장 연속 부분 수열

www.acmicpc.net

 

저는 투포인트를 통해  문제를 해결하였습니다.

투 포인트를 통해 그 사이에 특정 숫자들이 몇개 있는지를 확인하고 이 개수가 m를 파악합니다. 이때 m보다 크다면 startIndex를 줄여 사이 길이를 줄이면서 가장 긴 길이를 찾아 문제를 해결하였습ㄴ디ㅏ.

 

package BOJ.twopoint;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ_20922_3 {
    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 m = Integer.parseInt(st.nextToken());
        st = new StringTokenizer(br.readLine());
        int[] number = new int[n];
        for(int i = 0 ; i  < n ; i++){
            number[i] = Integer.parseInt(st.nextToken());
        }
        int result = cal(number,n,m);
        System.out.println(result);
    }
    private static final int SIZE = 100_000;
    private static int cal(int[] numbers, int n, int m) {
        int[] cnt = new int[SIZE+1];
        int startIndex = 0;
        int endIndex = 0;
        int result = 0;
        while(true){
            if(endIndex >= n){
                break;
            }
            int num = numbers[endIndex++];
            cnt[num]++;
            while(cnt[num] > m){
                cnt[numbers[startIndex++]]--;
            }
            result = Math.max(result,endIndex-startIndex);
        }
        return result;
    }
}