9184번: 신나는 함수 실행
입력은 세 정수 a, b, c로 이루어져 있으며, 한 줄에 하나씩 주어진다. 입력의 마지막은 -1 -1 -1로 나타내며, 세 정수가 모두 -1인 경우는 입력의 마지막을 제외하면 없다.
www.acmicpc.net
- 얼핏 볼 때는 뭔가 까다로운 문제일 것 같지만, 조금만 읽어봐도 어렵지 않게 풀 수 있다.
- 어차피 w 함수의 a, b, c 값들이 재귀에서 반드시 - 로만 내려가기 때문에, 이전 값들을 구해놓으면 다시 쓸 수 있다.
- 0 이하와 20 초과는 특정 값을 반환하기 때문에, 실제로는 1,1,1 부터 20,20,20 까지만 구하면 된다.
- 재귀 호출만 생각하면 신이 난다?
w = [[[1 for a in range(21)] for b in range(21)] for c in range(21)] # 계산된 w값들. 재사용하여 재귀를 막음
def pre_calculate(a, b, c): # 주어진 알고리즘 그대로
if a < b and b < c:
w[a][b][c] = w[a][b][c-1] + w[a][b-1][c-1] - w[a][b-1][c]
else:
w[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]
for a in range(1, 21):
for b in range(1, 21):
for c in range(1, 21):
pre_calculate(a, b, c) # w 함수 재귀호출을 미리 계산해놓음
while True:
a, b, c = map(int, input().split())
if a == -1 and b == -1 and c == -1: # 종료 값인지 검사
break
answer = 0
if a <= 0 or b <= 0 or c <= 0: # 하나라도 0 이하가 있으면 무조건 1
answer = 1
elif a > 20 or b > 20 or c > 20: # 전부 다 20 초과일 경우 20,20,20 의 값 반환
answer = w[20][20][20]
else:
answer = w[a][b][c] # 그 외엔, 미리 계산해둔 w 출력값 반환
print(f"w({a}, {b}, {c}) =", answer)
'PS > BOJ' 카테고리의 다른 글
[백준] 3258 : 컴포트 (0) | 2021.01.21 |
---|---|
[백준] 18352 : 특정 거리의 도시 찾기 (0) | 2021.01.21 |
[백준] 7562 : 나이트의 이동 (0) | 2021.01.17 |
[백준] 2346 : 풍선 터뜨리기 (0) | 2021.01.16 |
[백준] 1699 : 제곱수의 합 (0) | 2021.01.15 |