www.acmicpc.net/problem/9184

 

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

+ Recent posts