본문 바로가기
Algorithms

백준 9184. 신나는 함수 실행

by Brian Go 2022. 6. 23.

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

 

9184번: 신나는 함수 실행

입력은 세 정수 a, b, c로 이루어져 있으며, 한 줄에 하나씩 주어진다. 입력의 마지막은 -1 -1 -1로 나타내며, 세 정수가 모두 -1인 경우는 입력의 마지막을 제외하면 없다.

www.acmicpc.net

 

Dynamic Programming에서는 재귀를 전혀 사용하지 않는 줄 알아서 헤매었으나

동적 프로그래밍의 정의를 검색해본 후로 이해가 갔다 ㅋㅋㅋㅋ

 

단순히 말하면 이전에 구한 답을 재활용하면 된다.

 

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]
	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 for _ in range(21)] for _ in range(21)] for _ in range(21)]

while True:
	a, b, c = map(int, input().split())
	if a==b==c==-1:
		break
	print("w({}, {}, {}) = {}".format(a, b, c, w(a,b,c)))

3차원 배열을 활용해서 각 a,b,c,에 대한 답을 저장해놓는다. 이 때 숫자들은 모두 20 이하이므로 21개의 칸을 만들어 배열을 초기화한다.

그리고 만약 dp[a][b][c]에 값이 없다면 구하고, 있으면 반환해주면 된다.

'Algorithms' 카테고리의 다른 글

백준 1912. 연속합  (0) 2022.06.26
백준 1904. 01타일  (0) 2022.06.24
백준 24416. 알고리즘 수업 - 피보나치 수 1  (0) 2022.06.22
백준 14889. 스타트와 링크  (0) 2022.06.21
백준 14888. 연산자 끼워넣기  (0) 2022.06.20

댓글