반응형
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42626
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 분석
[제한 사항]
- scoville의 길이는 2 이상 1,000,000 이하입니다.
- K는 0 이상 1,000,000,000 이하입니다.
- scoville의 원소는 각각 0 이상 1,000,000 이하입니다.
- 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 return 합니다.
음식들의 시코빌 지수 가 주어졌을 때 주어진 음식들을 섞어 모든 음식의 스코빌 지수가 K 이상이 되도록 하는 문제이다.
가장 맵지 않은 음식과 두 번째로 맵지 않은 음식을 섞어
(가장 맵지 않은 음식의 스코빌 지수 + 두 번째로 맵지 않은 음식의 스코빌 지수 *2) 의 스코빌을 갖는 음식을 만들어 낼 수 있다.
scoville 배열의 길이가 최대 10^6 이기 때문에 O(n) 의 시간 복잡도로 문제를 풀어야 한다.
즉 scoville 배열 안에서 다시 scoville 배열이 반복되면 안된다.
문제 접근
이 문제는 주어진 스코빌 중 가장 작은 2개를 항상 꺼내서 새로운 음식을 만들어주어야 한다.
그렇기 때문에 우선순위 큐를 사용하면 문제를 쉽게 해결할 수 있다.
모든 음식들을 우선순위 큐에 넣어주고 큐에 들어간 모든 음식들이 K 보다 커질 때 까지 우선순위 큐에서 음식 2개를 빼 섞어서 다시 우선순위 큐에 넣어주면 된다.
만약 우선순위 큐의 크기가 1이 된다면 반복을 멈추고 마지막 남은 음식의 스코빌 지수가 K보다 작다면 -1을 리턴한다.
코드
import java.util.*;
class Solution {
public int solution(int[] scoville, int K) {
int answer = 0;
PriorityQueue<Integer> pq = new PriorityQueue<>();
for(int s : scoville){
pq.offer(s);
}
while(pq.peek() < K && pq.size()>=2){
int small = pq.poll();
int big = pq.poll();
int mix = small + big * 2;
pq.offer(mix);
answer++;
}
if(pq.peek() < K){
return -1;
}
return answer;
}
}
반응형
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 124 나라의 숫자 (1) | 2024.04.18 |
|---|---|
| [프로그래머스] 구명보트 (1) | 2024.04.18 |
| [프로그래머스] 줄 서는 방법 (1) | 2024.04.12 |
| [프로그래머스] 다리를 지나는 트럭 (0) | 2024.04.11 |
| [프로그래머스] 의상 (0) | 2024.04.11 |