====== 더 맵게 ====== ===== 풀이 ===== * 그냥 시키는 대로 구현하면 되고, 그 때 쉽게 떠오르는 방법은 [[ps:우선순위큐]]를 쓰는 것. [[ps:problems:programmers:고득점 Kit]]에서도 우선순위큐의 연습문제로 분류되어있다. * 최솟값 우선순위 큐에 값들을 다 넣어놓고, 최솟값 두개를 pop 하고, 그것을 섞어서 만든 새 값을 push 하는 것을 반복하면 된다. pop과 push는 모두 O(logn)이고, 이것을 최대 n번 하므로 시간복잡도는 O(nlogn) * 조금 생각해보면, 기존값들을 섞어서 만들어지는 값은 증가하는 순서로 만들어진다 (재료로 사용하는 값이 커지므로, 재료1+2*재료2 로 만들어지는 새 값도 커진다). 따라서 새로 만들어진 값들은 일반 큐에 저장하고, 추가할때는 맨 뒤에 push하는 것으로도 정렬된 순서를 유지할 수 있다. * 그러면, 먼저 처음 주어진 원래 값들은 정렬해두고, 새 값을 저장할 큐를 만들어둔다. 최솟값을 뽑을때는 처음 주어진 값들중의 최솟값과 새 값들의 최솟값을 비교해서 작은 쪽을 빼내면 되고 이것은 O(1)이다. 최솟값 두개를 섞어서 새 값을 만들고 이것은 새값을 저장하는 큐의 뒤에 push 하는 것도 O(1). * pop과 push가 모두 O(1)이므로, n번 처리하는데에는 O(n)이 걸린다. 다만 맨 처음에 원래 값들을 한번 정렬하는 시간이 O(nlogn)이므로, 전체 시간복잡도는 우선순위큐를 쓰는 방법과 같다. 하지만 실제 실행시간은 훨씬 더 단축된다. ===== 코드 ===== ==== 코드 1 - 힙을 사용 ==== """Solution code for "Programmers 42626. 더 맵게". - Problem link: https://programmers.co.kr/learn/courses/30/lessons/42626 - Solution link: http://www.teferi.net/ps/problems/programmers/42626 """ import heapq def solution(scoville, K): heapq.heapify(scoville) for i in range(len(scoville) - 1): min_scov = heapq.heappop(scoville) if min_scov >= K: return i new_scov = min_scov + scoville[0] * 2 heapq.heapreplace(scoville, new_scov) return i + 1 if scoville[0] >= K else -1 ==== 코드 2 - deque를 사용 ==== """Solution code for "Programmers 42626. 더 맵게". - Problem link: https://programmers.co.kr/learn/courses/30/lessons/42626 - Solution link: http://www.teferi.net/ps/problems/programmers/42626 """ import collections INF = float('inf') def solution(scoville, K): def pop_min(): min_orig = orig_scovilles[-1] if orig_scovilles else INF min_new = new_scovilles[0] if new_scovilles else INF if min_orig < min_new: return orig_scovilles.pop() else: return new_scovilles.popleft() orig_scovilles = sorted(scoville, reverse=True) new_scovilles = collections.deque() for i in range(len(scoville) - 1): min_scov = pop_min() if min_scov >= K: return i second_min_scov = pop_min() new_scov = min_scov + second_min_scov * 2 new_scovilles.append(new_scov) return i + 1 if new_scovilles[0] >= K else -1 {{tag>프로그래머스 ps:problems:programmers:Level_2}}