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 = {1, 2, 3, 9, 10, 12}; @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 |