기록하고 까먹지 말기

9184 본문

전공/백준

9184

yha97 2022. 10. 29. 14:44

날짜 : 2022. 10. 29

사용 언어 : python

 

문제

 

 

코드

import sys

def w(a, b, c):
    if a <= 0 or b <= 0 or c <= 0:
        return 1
    if a > 20 or b > 20 or c > 20:
        return w(20, 20, 20)
    if dp[a][b][c]: 
        return dp[a][b][c] # 값이 이미 존재하면 리턴
    if a < b < c :
        dp[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
        return dp[a][b][c]
    dp[a][b][c] = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
    return dp[a][b][c]


dp = [[[0] * 21 for i in range(21)] for j in range(21)]
while True:
    a, b, c = map(int, sys.stdin.readline().split())
    if a == -1 and b == -1 and c == -1:
        break
    print("w(%d, %d, %d) = %d"%(a, b, c, w(a, b, c)))

 

 

알게된 점

- DP에 관해서 애매하게 알고 있었던 것을 확인하는 문제였다.

- 피보나치 문제를 경험으로 단순 for문을 돌려서 문제를 푸는 것이 DP라고 생각했는데 찾아보니 문제를 분할하여 이를 이용해 풀이하는 것이 DP라는 것을 알게되었다.

- 풀이를 보니 중간에 if문을 하나 더 넣음으로써 기존에 값이 이미 존재하는 경우 이를 곧바로 리턴하여 불필요한 재귀를 방지하는 것이 골자였다.

- 그리디는 많이 풀어보았지만 다른 문제들을 풀어보지 않아서 많이 공부해야한다는 것을 알게 되는 문제였다.

 

 

참고 사이트

- https://galid1.tistory.com/507

 

알고리즘 - Dynamic Programming(동적프로그래밍)이란?

Dynamic Programming(동적계획법) 이란 1. Dynamic Programming(동적계획법)이란? 큰 문제를 작은문제로 나누어 푸는 문제를 일컫는 말입니다. 동적 계획법이란 말 때문에 어떤 부분에서 동적으로 프로그래

galid1.tistory.com

- https://seraup.dev/8

 

백준 9184번 신나는 함수 실행 (Python)

문제에 점화식까지 쓰여있어서 당황스러웠다.. 너무나도 당연하게 문제에 쓰여져있는대로 코드를 작성하면 안된다! 재귀함수를 사용해야할 때 이것을 메모이제이션 하는 방법을 묻는 문제이다

seraup.dev

https://namu.wiki/w/메모이제이션

 

메모이제이션 - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권

namu.wiki

 

'전공 > 백준' 카테고리의 다른 글

1080  (0) 2022.10.30
1904  (0) 2022.10.29
24416  (0) 2022.10.29
10845  (0) 2022.10.28
1449  (0) 2022.10.27