문제 출처 - https://programmers.co.kr/learn/courses/30/lessons/42626
- 문제 -
매운 것을 좋아하는 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 합니다.
- 접근 -
1. 가장 작은 수가 K보다 작으면 계속 반복해주면 된다.
2. 가장 작은 수를 바로 뽑을 수 있는 방법은 우선순위 큐를 사용해주었다. 우선순위 큐의 top()은 해당 큐에 있는 값 중에 가장 큰 수를 return 시켜준다.
3. 우리는 가장 작은 값을 return 받고 싶기 때문에 원래 scoville값에 음수를 붙혀서 넣어준다. 왜냐하면
[3,2,1]에서 우린 1을 뽑고 싶지만 우선순위 큐에서 top()의 return 값은 3이 나올 것이다. 다만 음수를 곱하여 넣어준다면 [-3,-2,-1]의 형태로 들어갈 것이고 top()의 return값은 -1일 것이고 그것을 다시 음수를 곱해주면 최소값을 얻을 수 있다.
- 후기 -
1. 우선순위 큐를 사용할 줄 안다면 쉽게 풀 수 있는 문제이다.
- 코드 -
c++
#include <string>
#include <vector>
#include <queue>
using namespace std;
priority_queue <int> pq;
int scovile_mix(int first, int second) {
int value = 0;
value = first + second * 2;
return value;
}
int solution(vector<int> scoville, int K) {
int answer = 0;
for (int i = 0; i < scoville.size(); i++) {
pq.push({ -scoville[i] }); //음수로 만들어서 넣는다.
}
while (1) {
int minimum_scobil = -pq.top();
if (minimum_scobil < K) {
pq.pop();
if (pq.empty()) {
return -1;
}
int second_scobil = -pq.top();
pq.pop();
int new_scobill = scovile_mix(minimum_scobil, second_scobil);
pq.push(-new_scobill);
answer++;
}
else {
break;
}
}
return answer;
}
Python 3 (추가 업로드)
import heapq
def mix(first,second):
return first+ second*2
def bfs(scoville,K):
successFlag = False
count = 0
while len(scoville)>=1:
first = heapq.heappop(scoville)
if first > K:
successFlag = True
break
if len(scoville)>=1:
second = heapq.heappop(scoville)
mixResult = mix(first,second)
heapq.heappush(scoville, mixResult)
count+=1
if successFlag:
return count
else:
return -1
def solution(scoville, K):
answer = 0
heapq.heapify(scoville)
answer = bfs(scoville,K)
return answer
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - H-index(level 2)//Wanna Be 컴잘알 (0) | 2019.10.17 |
---|---|
프로그래머스 - 전화번호 목록(Level 2)/Wanna Be 컴잘알 (0) | 2019.10.17 |
프로그래머스 - 조이스틱(level 2)//Wanna Be 컴잘알 (0) | 2019.10.17 |
프로그래머스 - 소수 찾기(Level 2)/Wanna Be 컴잘알 (0) | 2019.10.12 |
프로그래머스 - 큰 수 만들기(Level 2)/Wanna Be 컴잘알 (0) | 2019.10.09 |