study record

[프로그래머스-자바] 보석쇼핑 (2020카카오인턴십) 본문

알고리즘

[프로그래머스-자바] 보석쇼핑 (2020카카오인턴십)

asong 2021. 4. 24. 16:32

보석쇼핑

  • HashSet으로 보석의 개수를 구한다.
  • gems[] 배열을 돌아가면서 큐에 넣으며, HashMap을 사용해 중복되는 보석의 개수들을 저장한다.
  • 이때 큐.peek()과 HashMap.get()을 통해 큐의 첫번째 보석 개수가 1개를 초과하면 startPoint를 갱신해준다.
  • hashMap의 사이즈와 HashSet의 크기가 같으면 모든 보석을 다 담은 것이므로 이때의 큐의 시작지점과 큐 사이즈를 통해 시작 진열대 번호와 끝 진열대 번호를 구해낸다.

연속된 것들을 처리해야하므로 Queue를 사용하고, 

중복되지 않은 개수를 알기 위해 HashSet,

중복되는 것들을 알고 처리하기 위해 HashMap을 사용!

 

이해가 안되는 부분은 length를 마지막에 체크하는 부분이다. 그냥 break;하면 되는 거 아닐까..

 

import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;

public class gemShopping {
    public static void main(String[] args) {
        String[] gems = {"DIA", "RUBY", "RUBY", "DIA", "DIA", "EMERALD", "SAPPHIRE", "DIA"};
        System.out.println(solution(gems)[0] + " " + solution(gems)[1]);
    }

    public static int[] solution(String[] gems) {
        Queue<String> q = new LinkedList<String>();
        HashSet<String> hs = new HashSet<String>();
        HashMap<String, Integer> hm = new HashMap<String, Integer>();
        int startPoint = 0;
        int length = Integer.MAX_VALUE;
        int start = 0;

        int[] answer = {};

        for (String gem : gems) {
            hs.add(gem);
        }

        for (String gem : gems) {
            q.add(gem);
            hm.put(gem, hm.getOrDefault(gem, 0) + 1);

            while (true) {
                String temp = q.peek();
                if (hm.get(temp) > 1) {
                    q.poll();
                    hm.put(temp, hm.get(temp) - 1);
                    startPoint++;
                } else {
                    break;
                }
            }

            if (hm.size() == hs.size() && length > q.size()) {
                length = q.size();
                start = startPoint;
            }
        }


        return new int[]{start + 1, start + length};
    }
}