9184번은 DP 문제이다.
a, b, c 셋 중 하나라도 0 이하이거나 21 이상일 경우 1 또는 w(20,20,20) 값을 반환 해주는 함수이다.
문제에 주어진 코드의 경우 재귀적인 방법을 사용 할 때 한 번 했던 계산을 다시하게 된다. 이때 동적 프로그래밍(dynamic programming)을 통해서 불필요한 연산을 건너뛸 수 있다.
dp table을 리스트로 생성하고 a, b, c 인데스에 맞게 결과 값을 할당시키면 같은 연산을 다시 할 때 리스트에서 값을 받아오도록 하기만 하면 된다.
끝.
li1 = [[[False for i in range(20)] for i in range(20)] for i in range(20)]
def w(a,b,c,d):
if a <= 0 or b <= 0 or c <= 0:
return 1
elif a > 20 or b > 20 or c > 20:
if not d[19][19][19]:
d[19][19][19] = w(20, 20, 20,d)
return d[19][19][19]
elif a < b and b < c :
if not d[a-1][b-1][c-1]: d[a-1][b-1][c-1] = w(a, b, c-1,d) + w(a, b-1, c-1,d) - w(a,b-1,c,d)
return d[a-1][b-1][c-1]
else :
if not d[a-1][b-1][c-1]: d[a-1][b-1][c-1] = w(a-1,b,c,d) + w(a-1,b-1,c,d) + w(a-1,b,c-1,d) - w(a-1,b-1,c-1,d)
return d[a-1][b-1][c-1]
while True:
x,y,z = map(int,input().split())
if x==-1 and y==-1 and z==-1:
break
print(f"w({x}, {y}, {z}) = {w(x,y,z,li1)}")
'문제풀이' 카테고리의 다른 글
프로그래머스 정수 삼각형 파이썬 (0) | 2023.09.30 |
---|---|
프로그래머스 3 x n 타일링 파이썬 (0) | 2023.09.30 |
소프티어(softeer) 복잡한 조립라인2 파이썬(python) (0) | 2023.09.26 |
소프티어 강의실 배정 파이썬(python) (0) | 2023.09.24 |
프로그래머스 줄 서는 방법 (0) | 2023.04.08 |