본문 바로가기
  • soobinhand의 기술 블로그
카테고리 없음

[프로그래머스] 더 맵게 - JAVA

by soobinhand 2021. 10. 29.
728x90

[프로그래머스] 더 맵게 - JAVA

이 문제는 가장 작은 두 수를 뽑으라는 말을 보자마자 우선순위 큐를 생각했습니다.

우선순위 큐는 큐와 다르게 FIFO 방식이 아니라 우선순위가 높은 원소가 먼저 제거되는 큐입니다.

우선순위가 가장 높은 값 = 스코빌 지수가 가장 낮은 값

우선순위가 그 다음으로 높은 값 = 스코빌 지수가 두번째로 낮은 값

을 대입해서 연산을 진행합니다.

원래의 값을 새로운 값으로 대체해야하므로 peek()이 아닌 poll()을 사용합니다.

 

public int solution(int[] scoville, int K) {
        int answer = 0;
        PriorityQueue<Integer> queue = new PriorityQueue<>();
        for (int i : scoville){
            queue.offer(i);
        }
        while (queue.peek() <= K){
            if (queue.size() == 1){
                return -1;
            }
            int a = queue.poll();
            int b = queue.poll();

            int result = a + (b*2);
            queue.offer(result);
            answer++;
        }

        return answer;
    }

 

Java에서 제공하는 PriorityQueue 를 사용했습니다.

우선 scoville 배열에 들어온 숫자들을 큐에 넣어줍니다.

큐의 맨 첫 원소를 삭제하지 않고 가져오는 peek()함수를 사용하여 K보다 작으면 while문을 계속 돌립니다.

그 후 예외처리 한 번 해주고, poll()함수를 사용하여 첫번째 원소를 삭제하면서 가져옵니다.

그 후 offer를 통해 result를 큐에 넣어줍니다.

728x90

댓글