https://www.acmicpc.net/problem/20922
20922번: 겹치는 건 싫어
홍대병에 걸린 도현이는 겹치는 것을 매우 싫어한다. 특히 수열에서 같은 원소가 여러 개 들어 있는 수열을 싫어한다. 도현이를 위해 같은 원소가 $K$개 이하로 들어 있는 최장 연속 부분 수열
www.acmicpc.net
코드설명
투 포인터 + 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 |