728x90
https://www.acmicpc.net/problem/9184
나의 풀이
아래의 재귀함수를 효율성 테스트를 통과하게 변경하는 문제
if a <= 0 or b <= 0 or c <= 0, then w(a, b, c) returns:
1
if a > 20 or b > 20 or c > 20, then w(a, b, c) returns:
w(20, 20, 20)
if a < b and b < c, then w(a, b, c) returns:
w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
otherwise it returns:
w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
코드가 주어졌기 때문에 파이썬으로 뼈대를 만들고 피보나치 문제에서 list를 이용하여 f(n-1)+f(n-2)를 저장한 것처럼 memory list를 만들어 중복된 a, b, c 값이 들어올 때 빠르게 계산하도록 함
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 memo[a][b][c]:
return memo[a][b][c]
if a < b < c:
memo[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
return memo[a][b][c]
else:
memo[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 memo[a][b][c]
memo = [[[0 for _ in range(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(f'w({a}, {b}, {c}) = {w(a,b,c)}')
728x90
'Coding Test > Baekjoon' 카테고리의 다른 글
[Python] 파이썬 백준 (9461) 파도반 수열 (0) | 2023.05.31 |
---|---|
[Python] 파이썬 백준(1904) 01타일 (0) | 2023.05.31 |
[Python] 파이썬 백준(24416) 피보나치 수1 (0) | 2023.05.30 |
[Python] 파이썬 백준(24479) 알고리즘 수업 - 깊이 우선 탐색 1 (0) | 2023.05.23 |
[Python] 파이썬 백준(11866) 요세푸스 문제 0 (0) | 2023.05.04 |