두개의 포인터를 0으로 초기화하고, start는 고정 후 end을 오른쪽으로 이동시키며 수열의 인덱스에 해당하는 숫자 채count를 증가시킨다. endIdx에 해당하는 수열의 카운트가 k보다 크면, endIdx의 이동을 그만두고 해당 부분 수열의 길이를 계산하여 갱신한다.
그리고 오른쪽 포인터인 startIdx를 한칸 오른쪽으로 이동시켜 다시 탐색을 시작한다.
package BOJ;
import java.io.*;
import java.util.*;
public class sol20922 {
static int n, k;
static int[] arr;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
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[] count = new int[100001];
int startIdx = 0;
int endIdx = 0;
int answer = 0;
while (endIdx < n) {
while (endIdx < n && count[arr[endIdx]] + 1 <= k) {
count[arr[endIdx]]++; // 이동할 때 마다 해당 숫자 카운트 증가
endIdx++; // 왼쪽으로 end 이동
}
answer = Math.max(answer, endIdx - startIdx);
count[arr[startIdx]]--; // start를 오른쪽으로 하나 이동시키기 전에 count 감소
startIdx++; // 오른쪽이 고정된 상태의 최대 길이를 구했으므로 다음 탐색을 위해 오른쪽으로 start 한칸 이동
}
System.out.println(answer);
}
}