문제는 다음과 같다.
https://programmers.co.kr/learn/courses/30/lessons/42626
문제 해석, 예제 패턴 분석
Scoville = [1, 2, 3, 9, 10, 12]
K = 7
return 2
규칙에 따라 새로운 음식의 스코빌 지수는
1 + 2 * 2 = 5
3 + 5 * 2 = 13
으로 만들어진다.
알고리즘의 구상과 복잡도 탐색
파이썬에서 힙의 활용
import heapq heapq.heapify(list) #list를 min heap으로 구성 heapq.heappop(list) #min heap list에서 최소값 삭제 및 반환 heapq.heappush(list,x) #min heap list에 원소 x삽입
코드 구현
import heapq
def solution(scoville, k):
answer = 0
heapq.heapify(scoville) #리스트를 min heap으로
while True: #while pop구문을 활용
min1 = heapq.heappop(scoville) #최소값을 꺼내서
if min1 >= K: #기준값을 넘겼으면 멈추고(마치 재귀함수의 종료선언문과 같다)
break
elif len(scoville) == 0: #기준값을 못넘기고 마지막 값을 꺼냈다면 또 멈춘다.
answer = -1
break
min2 = heapq.heappop(scoville)
new_scoville = min1 + 2 * min2
heapq.heappush(scoville, new_scoville)
answer += 1
return answer
알고리즘의 시간 복잡도
문제는 아래와 같다.
https://programmers.co.kr/learn/courses/30/lessons/42895
동적계획법(Dynamic Programming)
문제 해석, 예제 패턴 분석
동적계획법을 사용한 알고리즘의 구상
N을 한 번 사용해서 만들 수 있는 수(들) -> A1
N을 두 번 사용해서 만들 수 있는 수(들) -> A2
N을 세 번 사용해서 만들 수 있는 수(들) -> A3
.
.
.
N을 n-1 번 사용해서 만들 수 있는 수(들) -> An-1
위 예시를 통해 N을 n 번 사용해서 만들 수 있는 수들은 그 전까지의 값들을 모두 안다는 가정하에, N을 1번 사용한 A1 부터 n-1번 사용한 An-1까지를 각각 대응하는 An-1부터 A1까지를 사칙연산으로 계산해주는 경우의 수 + 1(N을 n번 나열한 숫자)이 된다는 것을 알 수 있다.
구상한 알고리즘의 복잡도
코드 구현
def solution(N, number):
if N == number:
return 1
s = [set() for x in range(8)]
for i, x in enumerate(s, start=1):
x.add(int(str(N) * i))
for i in range(1, 8):
for j in range(i):
for op1 in s[j]:
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
알고리즘의 시간 복잡도
문제는 아래와 같다.
https://programmers.co.kr/learn/courses/30/lessons/43164
배경지식
깊이 우선 탐색(DFS; Depth First Search)
너비 우선 탐색(BFS; Breadth First Search)
문제 해석, 예제 패턴 분석
알고리즘의 구상
코드 구현
def solution(tickets):
routes = {}
for t in tickets:
routes[t[0]] = routes.get(t[0], []) + [t[1]]
print(routes)
for r in routes:
routes[r].sort(reverse=True)
stack = ['ICN']
path = []
while len(stack) > 0:
top = stack[-1]
if top not in routes or len(routes[top]) == 0
path.append(stack.pop())
else:
stack.append(routes[top][-1])
routes[top] = routes[top][:-1]
return path[::-1]
알고리즘의 복잡도