// [input]
9 2 // N K
1 1 2 1 2 2 1 1 2 // 수열
freq[x] 배열을 입력값 최대의 크기로 설정freq[x]로 현재 구간에서 x가 몇 번 나왔는지 카운팅import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// [input]
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[] arr = new int[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
// [logic]
// 입력값의 크기의 카운팅 배열 만들기
int[] freq = new int[100001];
int left = 0;
int maxLen = 0;
for (int right = 0; right < N; right++) {
freq[arr[right]]++;
// 겹치는 원소가 K개를 초과하면
while (freq[arr[right]] > K) {
freq[arr[left]]--;
left++;
}
maxLen = Math.max(maxLen, right - left + 1);
}
System.out.println(maxLen);
}
}
freq[arr[right]]++;
while (freq[arr[right]] > K) {
freq[arr[left]]--;
left++;
}
freq[arr[right]] > K 이면 해당 구간은 조건을 위반한 상태가 됨.freq[arr[right]] 이 다시 K이하로 떨어지고 해당 구간은 조건을 반족하게 됨right - left + 1 max 값 갱신이 코드에서 잘못된 부분이나 개선할 점이 있다면 언제든지 댓글로 알려주세요.
알고리즘을 작성하면서 더 좋은 코드를 만들 수 있도록 도와주시면 정말 감사하겠습니다! 🙂