백준 9184 신나는 함수 실행

치즈말랑이·2022년 3월 21일
0

https://www.acmicpc.net/problem/9184

dp문제인데, 3차원배열을 만들어본적이 없어서 어떻게 하는지 검색해봤다.
https://jainn.tistory.com/82
근데 그냥 2차원 배열 만들듯이 만들어서 차원수가 늘어나도 그냥 이렇게 하면 되는구나 싶었다.

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]: # dp값이 이미 있으면 바로 리턴, 없으면 구하고 리턴
        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)
        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 _ in range(21)] for _ in range(21)]
while True:
    a, b, c = map(int, sys.stdin.readline().strip().split())
    if a == b == c == -1:
        break
    print(f'w({a}, {b}, {c}) = {w(a, b, c)}')

어렵지 않은 문제였지만, 생소한 3차원 배열, 그리고 if dp[a][b][c]: return dp[a][b][c]를 생각하지 못했다. dp는 계산 시간을 줄이기 위해 값을 저장해놓기때문에 다시 계산하지 않아도 된다. 항상 기억하도록 하자.

profile
공부일기

0개의 댓글

관련 채용 정보