반응형
프로그래머스 힙 더맵게
처음풀이
class Solution {
static PriorityQueue<Integer> pq;
public int solution(int[] scoville, int K) {
pq = new PriorityQueue<>();
for(int s: scoville){
pq.add(s);
}
return shake(0, K);
}
public static int shake(int count, int K){
//하나남음
if(pq.size()==1){
if(K<=pq.poll()) return count; //통과
else return -1; //나가리
}
//두개이상 남음
int last1 = pq.poll();
int last2 = pq.poll();
if(K <= last1) return count; //통과
pq.add(last1+last2*2);
return shake(count+1, K);
}
}
이것도 맞긴 한데, 데이터의 양이 커지맨 재귀가 스택에 너무 많이 쌓여서 오버플로우 난다.
수정된 풀이
package 더맵게;
import java.util.PriorityQueue;
public class Solution {
static PriorityQueue<Integer> pq;
public static void main(String[] args){
int[] scoville = {1, 2, 3, 9, 10, 12};
int K=7;
pq = new PriorityQueue<>();
for(int s: scoville){
pq.add(s);
}
int count = 0;
while (true){
//하나남음
if(pq.size()==1){
if(K<=pq.poll()) break; //통과
else{
count = -1; //나가리
break;
}
}
//두개이상 남음
int last = pq.poll();
int last2 = pq.poll();
if(K <= last){
break; //통과
}
pq.add(last+last2*2);
count++;
}
System.out.println( count );
}
}
재귀를 반복문으로 수정
반응형
'알고리즘 > 문제풀이' 카테고리의 다른 글
[시뮬레이션] 나무 재태크 (0) | 2019.03.18 |
---|---|
직사각형 만들기 (0) | 2019.03.15 |
[투포인터] 부분합 (0) | 2019.03.08 |
[인덱스트리] 구간 합 구하기 (0) | 2019.03.06 |
[Union&Find] 네트워크연결 (0) | 2019.02.27 |