#include <string>
#include <vector>
#include<queue>
#include<iostream>
using namespace std;
struct comp{
bool operator() (long long int &a, long long int &b){
return a>b;
}
};
int solution(vector<int> scoville, int K) {
int answer = 0;
priority_queue<long long int,vector<long long int>,comp> q;//항상 가장 작은거
for(int i = 0;i<scoville.size();i++){
q.push(scoville[i]);
}
bool reachable = false;
int ctr = 0;//int 범위에서 될 것
while(!q.empty()){//하나 남았을 때 문제 생길 수 있음
long long int a = q.top();
q.pop();
if(a>=K){//목표 달성
reachable = true;
break;
}
if(q.empty()){//하나남았을 때
break;
}
long long int b = q.top();
q.pop();
long long int new_food = a + 2 * b;
//cout<<a<<", "<<b<<","<<new_food<<endl;
q.push(new_food);
//cout<<"pushing "<<new_food<<endl;
ctr++;
}
if(!reachable){
answer = -1;
}
else{
answer = ctr;
}
return answer;
}
한번의 섞기 연산에 2개의 음식이 필요하므로 while문에는 2개가 있을때라는 조건을 걸었다.
음식 수가 2개이상 남은 상황에서 k가 만들어지면 괜찮지만 극단적으로 예를 들었을 때,
음식들 : [3,5] , k :10 이런 상황이 생길 수 있다.
이 때 3, 5를 섞어서 13 하나만 queue(size : 1)에 들어가 있는 상황에서
while문을 탈출하고 queue의 top인 13은 무시당하게 된다.
#include <string>
#include <vector>
#include<queue>
#include<iostream>
using namespace std;
//3K 정도 예상해야하므로 long long
struct comp{
bool operator()(long long int &a, long long int &b){
return a>b;//sort와 다르게 반대로 함
}
};
int solution(vector<int> scoville, int K) {
int answer = -1;
priority_queue<long long int,vector<long long int>, comp> q;
for(int i = 0;i<scoville.size();i++){
q.push(scoville[i]);
}
int num = 0;
while(q.size()>=2){
long long int a = q.top();
q.pop();
long long int b = q.top();
//cout<<a<<","<<b<< ","<<a+b*2<<endl;
q.pop();
if(a>=K){
answer = num;
break;
}
num++;
q.push(a+b*2);
}
if(q.size()==1){
if(q.top()>=K){
//cout<<"1개만 남았을 때 :"<<q.size()<<" , "<<q.top()<<endl;
answer = num;
}
}
return answer;
}