https://www.acmicpc.net/problem/20922
1. 아이디어
카운팅 배열과 투 포인터 알고리즘을 활용하면 해결할 수 있다.
2. 문제풀이
수열의 앞쪽에 left, right 포인터를 설정한 후 right 포인터에 위치한 수가 카운팅 배열에서 K개 미만이면 포함할 수 있고, K개면 포함할 수 없다. 포함할 수 있으면 포함하고 right 포인터를 오른쪽으로 이동, 포함할 수 없으면 left 포인터의 수를 카운팅 배열에서 빼주고 left 포인터를 오른쪽으로 이동하는 과정을 반복하면 됐다.
3. 코드
import java.io.*;
import java.util.*;
public class Main {
private static final int MAX = 100_000;
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());
int[] arr = new int[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int left = 0;
int right = 0;
int len = 0;
int[] cntArr = new int[1 + MAX];
while (right < N) {
int cnt = cntArr[arr[right]];
if (cnt < K) {
cntArr[arr[right]]++;
right++;
len = Math.max(len, right - left);
} else {
cntArr[arr[left]]--;
left++;
}
}
System.out.println(len);
}
}
4. 후기
'코딩테스트 준비 > 백준' 카테고리의 다른 글
[백준] 17779번 - 게리맨더링 2 [Java] (0) | 2025.02.21 |
---|---|
[백준] 20920번 - 영단어 암기는 괴로워 [Java] (0) | 2025.02.20 |
[백준] 21610번 - 마법사 상어와 비바라기 [Java] (0) | 2025.02.19 |
[백준] 2108번 - 통계학 [Java] (0) | 2025.02.19 |
[백준] 31610번 - 飴の袋詰め (Drops Packing) [Java] (0) | 2025.02.19 |