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;
    	}
	
    }
      
}

+ Recent posts