[프로그래머스] 보석 쇼핑

2020. 7. 3. 00:51프로그래머스/카카오

import java.util.*;

class Solution {
    public int[] solution(String[] gems) {
        int[] answer = new int[2];
        answer[0] = 1;
        answer[1] = gems.length;
        
        int compare = gems.length-1;
        int start=0;
        int end=0;
        int flag =0;
        
        Map<String, Integer> gemMap = new HashMap<>();
        
        for(int i=0; i<gems.length; i++){
            if(!gemMap.containsKey(gems[i])){
                gemMap.put(gems[i],0);
            }
        }

        while(end<gems.length){
            if(flag<gemMap.size()){
                gemMap.put(gems[end],gemMap.get(gems[end])+1);             
                if(gemMap.get(gems[end])==1){
                    flag++;
                }
                 end++;
            }else{
                if((end-1)-start<compare){
                    answer[0] = start+1;
                    answer[1] = end;
                    compare = answer[1]-answer[0];
                }
                
                gemMap.put(gems[start],gemMap.get(gems[start])-1);
                
                if(gemMap.get(gems[start])==0){
                    flag--;
                }
                start++;
            }
        }
        
        return answer;
    }
}

1. 인덱스마다 재탐색을 실행하면 효율성에서 통과하지 못한다.

2. 따라서 최악의 경우로 초기화 한 후 , 처음과 끝을 정하고 인덱스를 변화시키며 조건에 부합할때마다 answer값을 변경시킨다.

3. 각 보석의 현재 갯수를 나타내도록 map을 설계한 후, 1개일때와 0개일때를 통해 현재 포함된 보석의 갯수를 알도록 한다.

4. 현재 포함된 보석의 갯수와 전체 보석의 갯수를 비교하며 answer을 업데이트 해나간다.