1. 힙(Heap)
import heapq
def solution(scoville, K):
answer = 0
heapq.heapify(scoville)
while True:
min1 = heapq.heappop(scoville)
if min1 >= K:
break
elif len(scoville) == 0:
answer = -1
break
min2 = heapq.heappop(scoville)
new_scoville = min1 + (min2 * 2)
heapq.heappush(scoville, new_scoville)
answer += 1
return answer
2. 동적계획법(Dynamic Programming)
주어진 최적화 문제를 재귀적인 방식으로 보다 작은 문제로 나누어 부분 문제를 풀고, 이 해를 조합하여 전체 문제의 해답에 이르는 방식
def solution(N, number):
# i번 사용해서 만들 수 있는 수들의 집합을 원소로 갖는다
s = [set() for x in range(8)]
# 5, 55, 555 ... 를 각 set에 먼저 채워주자
# enumerate에 start=1 주의하자
for i, x in enumerate(s, start=1):
x.add(int(str(N) * i))
# 이 때 이미 정답이 있는 경우가 있다
if number in s[i - 1]:
return i
for i in range(1, len(s)):
for j in range(i):
# j번 사용해서 만든 수 중 피연산자 op1을 가져온다
for op1 in s[j]:
# i - j - 1번 사용해서 만든 수 중 피연산자 op2를 가져온다
for op2 in s[i - j - 1]:
s[i].add(op1 + op2)
s[i].add(op1 - op2)
s[i].add(op1 * op2)
if op2 != 0:
s[i].add(op1 // op2)
if number in s[i]:
answer = i + 1
break
else:
answer = -1
return answer
3. 깊이/너비 우선 탐색(DFS/BFS)
def solution(tickets):
routes = {}
# key-출발지:value-도착지(리스트)
for t in tickets:
routes[t[0]] = routes.get(t[0], []) + [t[1]]
# 도착지를 알파벳 역순으로 정렬해둔다
for r in routes:
routes[r].sort(reverse=True)
stack = ['ICN']
path = []
while len(stack) > 0:
top = stack[-1]
# top에서 출발하는 티켓이 없거나, 이미 다 쓴 경우
if top not in routes or len(routes[top]) == 0:
# 방문 처리
path.append(stack.pop())
else:
# 스택에 top(다음 출발지가 됨)을 넣고
stack.append(routes[top][-1])
# 티켓을 뺀다
routes[top] = routes[top][:-1]
return path[::-1]