728x90
문제
접근 방식
길이가 N인 수열에서 같은 숫자끼리는 최대 K번까지만 사용한 부분 수열을 구해야 한다.
각 숫자들마다 등장 횟수를 기록해야하기 때문에 불리언 배열이 아닌
정수형 배열에 특정 숫자가 등장 할 때마다 해당 인덱스에 카운트를 증가시키면서
투 포인터로 탐색을 하다가 특정 숫자가 K번 이미 등장 했을 때 또 등장했다면
만들 수 있는 부분 수열의 끝이므로 현재 부분 수열의 길이를 구한 후에
현재 까지 가장 긴 부분 수열의 길이인지 비교하고 값을 바꿔주면 된다.
풀이
public class Main {
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];
int[] useCount = new int[200_001];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int end = 0;
int max = 0;
for (int start = 0; start < n; start++) {
while (end < n) {
if (useCount[arr[end]] == k) break;
useCount[arr[end++]]++;
}
max = Math.max(max, end - start);
useCount[arr[start]]--;
}
System.out.println(max);
}
}
'Java > Algorithms' 카테고리의 다른 글
[백준] 11726번 : 2×n 타일링 (1) | 2023.12.18 |
---|---|
[백준] 1149번 : RGB거리 (1) | 2023.12.17 |
[백준] 2531번 : 회전 초밥 (1) | 2023.12.17 |
[백준] 22862번 : 가장 긴 짝수 연속한 부분 수열 (large) (0) | 2023.12.16 |
[백준] 13144번 : List of Unique Numbers (0) | 2023.12.16 |