자료구조 및 알고리즘/백준

[python] 9184. 신나는 함수 실행

viamemine 2023. 2. 17. 13:24
728x90
반응형
  • 문제 

 

 

  • 올바른 풀이
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 and b < c:
        dp[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
    else:
        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 _ in range(21)] for _ 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({}, {}, {}) = {}' .format(a, b, c, w(a, b, c)))

 

해당 문제는 재귀 문제로, 다이나믹 프로그래밍 자료구조 방법으로 문제를 해결한다. 

다이나믹으로 문제를 해결하면, 한 번 계산한 값을 저장하고 불러오기 때문에 다시 계산하지 않아도 된다. 

이로써 연산시간이 크게 감소할 수 있는 것이다.

 

728x90

'자료구조 및 알고리즘 > 백준' 카테고리의 다른 글

[python] 1912. 연속합  (0) 2023.03.01
[python] 1904. 01타일  (0) 2023.02.20
[python] 1004. 어린왕자  (0) 2023.02.12
[python] 1966. 프린터 큐  (0) 2023.02.02
[python] 4949. 균형잡힌 세상  (0) 2023.01.30