https://leetcode.com/problems/last-stone-weight/
array 가 주어진다.
가장 큰 숫자 둘을 꺼낸다.
두 숫자가 같으면 둘 다 파괴하고,
다르면 그 차이를 다시 array에 넣는다.
위의 작업을 array의 크기가 1 이하로 떨어질 때 까지 반복한다.
array가 1이면 남은 숫자 하나를 반환하고,
0이면 0을 반환하는 문제이다.
이 문제는 PriorityQueue를 사용하면 간단하게 해결된다.
가장 큰 숫자를 꺼내기 위해서 내림차순 PriorityQueue 를 만든 후,
poll 로 두 개를 꺼내어 비교한 뒤 그 차이만큼을 다시 PriorityQueue 에 넣으면 된다.
위의 작업을 PriorityQueue의 size가 1 이하로 떨어질 때 꺼정 반복하면 된다.
코드를 보면 더 이해가 쉬울 것이다.
class Solution {
public int lastStoneWeight(int[] stones) {
int size = stones.length;
PriorityQueue<Integer> qu = new PriorityQueue<>(size, Collections.reverseOrder());
for(int stone : stones) {
qu.offer(stone);
}
while(qu.size()>1) {
int a = qu.poll();
int b = qu.poll();
if(a>b) qu.offer(a-b); //a와 b가 같은 경우는 파괴되므로 다시 offer 하지 않는다.
}
if(qu.size()==1) return qu.peek();
else return 0;
}
}
이것보다 더 빠르게 푼 알고리즘의 경우,
반복할 때마다 Arrays.sort 를 계속 적용하는데
문제의 최대 array length 가 30이라서 더 빠른 속도를 낼 수 있었던 듯.
만약 array가 일파만파 컸더라면 위의 PriorityQueue 를 사용하는 것이 더 현명한 선택일 것이다.
'Coding Interview' 카테고리의 다른 글
CS 인터뷰 준비 방법(코딩 테스트, 전산학) (0) | 2020.04.09 |
---|---|
[Baekjoon] 2790번 F7 (0) | 2020.03.26 |
[leetcode] Single Number (0) | 2020.02.11 |
[leetcode] Replace Elements with Greatest Element on Right Side (0) | 2020.02.03 |
Longest Increasing Subsequence 알고리즘 (0) | 2020.02.02 |