https://www.acmicpc.net/problem/20922
코드설명
투 포인터 + HashMap 을 활용하여 해결합니다.
주어지는 수열의 수의 최대값이 (1 <= a <= 100,000) 이므로 arr[100000] 으로 진행하여도 가능하지만,
HashMap을 활용하여 각 수의 빈도값을 가지고다니면서 K값을 넘는지 안넘는지 체크하면서 진행합니다.
HashMap의 시간복잡도는 값을 삽입, 검색하는 시간복잡도가 평균 O(1) 입니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static int N, K;
public static int[] arr;
public static HashMap<Integer, Integer> hashmap = new HashMap<Integer, Integer>();
public static int answer = 0;
public static void main(String[] args) throws IOException{
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());
}
simulate();
System.out.println(answer);
}
public static void simulate() {
int start = 0;
int end = 0;
while(start < N) {
while(end < N ) {
if(hashmap.getOrDefault(arr[end], 0) + 1 > K) { //K개의 중복값이 크다면 중단
break;
}
else if(hashmap.getOrDefault(arr[end], 0) + 1 <= K) {
hashmap.put(arr[end], hashmap.getOrDefault(arr[end], 0) + 1);
}
end+=1;
}
answer = Math.max(answer, end - start);
hashmap.put(arr[start], hashmap.get(arr[start]) - 1); //start가 이동하였으니 start값은 뺍니다.
start += 1;
}
}
}
'알고리즘 > Two Pointer' 카테고리의 다른 글
[백준] 2467 용액 - 투포인터 JAVA (0) | 2023.08.10 |
---|---|
[백준] 2531 회전 초밥 - 슬라이딩 윈도우(Sliding Window) + 투포인터(Two Pointer) + 원형(Circular) + HashMap(해시맵) JAVA (0) | 2023.08.09 |
[백준] 2003 수들의 합 2 - 투 포인터 JAVA (0) | 2023.08.03 |
[백준] 1940 주몽 - 투 포인터 + 정렬 JAVA (0) | 2023.08.03 |
[백준] 2018 수들의 합 5 - 투 포인터 JAVA (0) | 2023.08.02 |