본문 바로가기
프로그래머스/JAVA

[우선순위 큐] 더 맵게

by AsCE_hyunseung 2018. 10. 24.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.PriorityQueue;
 
public class Scoville {
    public int solution(int[] scoville, int K) {
        int answer = 0;
        PriorityQueue<Integer> scoInfo = new PriorityQueue<Integer>(scoville.length);
 
        addElement(scoville, scoInfo);
 
        return getAnswer(K, answer, scoInfo);
    }
 
    public int getAnswer(int K, int answer, PriorityQueue<Integer> scoInfo) {
        int tempSco;
        while (scoInfo.peek()<=K){//우선 순위큐의 제일 낮은 값이 K미만이면 실행
 
            if(scoInfo.size()<2){//예외 처리
                return -1;
            }
 
            tempSco=scoInfo.poll()+(scoInfo.poll()*2);//섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)
            scoInfo.add(tempSco);//가독성을 위해 tempSco이용
            answer++;
        }
        return answer;
    }
 
    public void addElement(int[] scoville, PriorityQueue<Integer> scoInfo) {
        for (int i : scoville) {//index접근 피하기(outOfIndex 에러)
            scoInfo.add(i);
        }
    }
}
cs

Scoville.java


1
2
3
4
5
6
7
8
9
10
11
12
13
import org.junit.Test;
 
import static org.junit.Assert.*;
 
public class ScovilleTest {
    Scoville s = new Scoville();
    int[] sco = {12391012};
 
    @Test
    public void 테스트_결과() {
        assertEquals(2, s.solution(sco, 7));
    }
}
cs

ScovilleTest.java


- 문제 설명

매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.


섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2)

Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다.

Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록 solution 함수를 작성해주세요.


- 제한 사항

scoville의 길이는 1 이상 1,000,000 이하입니다.

K는 0 이상 1,000,000,000 이하입니다.

scoville의 원소는 각각 0 이상 1,000,000 이하입니다.

모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 return 합니다.


간단한 알고리즘 문제였음에도 불구하고 시간을 꽤 썼는데 2가지 요인이 있었다.

예외처리 때문에 채점하는데 컴파일 에러가 계속 떠서 애를 먹었고 우선순위 큐의 개념만 알고 있어서 메소드나 이것 저것 찾아보느라 시간이 좀 걸렸다. 나중에 자료구조 개념 정리를 한번 해야겠다.(해시맵, 우선순위큐)

'프로그래머스 > JAVA' 카테고리의 다른 글

[스택/큐] 쇠막대기  (0) 2018.12.28
[스택/큐] 타워  (0) 2018.11.02
[level 2] 124 나라의 숫자  (0) 2018.10.17
[해시] 위장  (0) 2018.10.12
[해시] 전화번호 목록  (0) 2018.10.10