Front-end Developer
백준 알고리즘 9184 [파이썬] 본문
배운 내용
이 문제는 동적 계획법(DP)를 사용해서 풀어야 하는 문제이다. 동적 계획법으로 문제를 풀어봤지만 이번 문제를 통해서 동적 계획법이 무엇인지 정확하게 이해할 수 있었다.
동적 계획법 (Dynamic Programming)
동적 계획법은 재귀적으로 함수가 계속 실행될 때 소요 시간을 줄여주기 위해서 새로운 문제 값을 저장하고 해당 문제값이 저장되어있으면 다시 계산해서 그 값을 얻어내는게 아니라 미리 저장해두었던 값을 사용함으로써 재귀적으로 함수가 실행되는 시간을 대폭 줄여준다.
동적 계획법에도 여러가지 방법이 있는것으로 알고 있는데, 이 문제에서는 문제 값을 저장할 공간(리스트 또는 딕셔너리)을 만들고 그 곳에다 저장하고 필요할 때 사용한다.
문제
문제풀이
from sys import stdin
read = stdin.readline
# 해당 키값에 맞는 value값을 memo라는 딕션너리에 저장한다.
memo = {
}
def w(a, b, c):
# 만약에 memo안에 같은 key값이 있으면 value값을 가져와서 리턴한다.
if (a, b, c) in memo:
return memo[(a, b, c)]
elif a <= 0 or b <= 0 or c <= 0:
return 1
elif a > 20 or b > 20 or c > 20:
return w(20, 20, 20)
# 새로운 key값과 value값들을 메모에 저장하고 value값을 리턴한다.
elif a < b and b < c:
w_num = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
memo[(a, b, c)] = w_num
return w_num
else:
w_num = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
memo[(a, b, c)] = w_num
return w_num
while True:
a, b, c = map(int, read().split())
# a, b, c 값 모두가 -1 때 입력을 마지막으로 해야하기 때문에 while loop을 break한다.
if a == -1 and b == -1 and c == -1 :
break
# %d를 사용해서 ''안에 필요한 지정값을 넣어줄 수 있다.
print('w(%d, %d, %d) = %d' % (a, b, c, w(a, b, c)))
'알고리즘' 카테고리의 다른 글
백준 알고리즘 1010 [파이썬] (0) | 2021.03.15 |
---|---|
백준 알고리즘 1932 [파이썬] (0) | 2021.03.15 |
백준 알고리즘 10815 [파이썬] (0) | 2021.03.13 |
백준 알고리즘 4949 [파이썬] (2) | 2021.03.11 |
백준 알고리즘 11651 [파이썬] (0) | 2021.03.09 |
Comments