[Python] BOJ / 9184번 / 신나는 함수 실행

2023. 4. 16. 14:35·🥇 Problem Solving/Dynamic Programming
 

9184번: 신나는 함수 실행

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

www.acmicpc.net

 

📝 문제

재귀 호출만 생각하면 신이 난다! 아닌가요?

다음과 같은 재귀함수 w(a, b, c)가 있다.

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)

 

위의 함수를 구현하는 것은 매우 쉽다. 하지만, 그대로 구현하면 값을 구하는데 매우 오랜 시간이 걸린다. (예를 들면, a=15, b=15, c=15)

a, b, c가 주어졌을 때, w(a, b, c)를 출력하는 프로그램을 작성하시오.

 

📜 풀이

  • 위 함수를 그대로 구현해보면 아래와 같다.
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 a < b < c:
        return w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c)
    return w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1)
  • 여기서 중복되는 재귀를 제거하여 시간 복잡도를 줄이기 위해 DP 배열을 사용할 수 있으며, 그 방법은 아래와 같다.
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)

    # DP 배열에 저장된 값이 있는 경우 그 값을 바로 리턴
    if dp[a][b][c] != 0:
        return dp[a][b][c]

    # DP 배열에 저장된 값이 없는 경우 1
    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]
    
    # DP 배열에 저장된 값이 없는 경우 2
    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] * (21) for _ in range(21)] for _ in range(21)]
  • a, b, c의 값이 어떤 수가 나오든 0보다 작다면 1로, 20보다 크다면 w(20, 20, 20)으로 통일하기 때문에 DP 배열의 크기를 이에 맞게 잡아주었다.
  • 문제 풀이를 위한 전체 코드는 아래와 같다.

 

💻 소스코드

import sys
input = sys.stdin.readline

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] != 0:
        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]
    
    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] * (21) for _ in range(21)] for _ in range(21)]

while 1:
    a, b, c = map(int, input().split())

    if (a, b, c) == (-1, -1, -1):
        break

    print(f'w({a}, {b}, {c}) = {w(a, b, c)}')
저작자표시 (새창열림)

'🥇 Problem Solving > Dynamic Programming' 카테고리의 다른 글

[Python] BOJ / 1890번 / 점프  (0) 2023.04.16
[Python] BOJ / 1309번 / 동물원  (0) 2023.04.16
[Python] BOJ / 11660번 / 구간 합 구하기 5  (1) 2023.04.16
[Python] BOJ / 11057번 / 오르막 수  (0) 2023.04.15
[Python] BOJ / 9465번 / 스티커  (0) 2023.04.15
'🥇 Problem Solving/Dynamic Programming' 카테고리의 다른 글
  • [Python] BOJ / 1890번 / 점프
  • [Python] BOJ / 1309번 / 동물원
  • [Python] BOJ / 11660번 / 구간 합 구하기 5
  • [Python] BOJ / 11057번 / 오르막 수
Baeg-won
Baeg-won
  • Baeg-won
    좋았다면 추억이고 나빴다면 경험이다.
    Baeg-won
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 🍃 Spring, Spring Boot
        • 스프링 프레임워크 기초
        • 스프링 핵심 원리 - 기본편
        • 자바 ORM 표준 JPA 프로그래밍 - 기본편
        • 스프링 MVC
        • 실전! 스프링 부트와 JPA 활용1 - 웹 애플리..
      • 🥑 Web Technoloy
      • 🚗 Backend Toy Project
        • 스프링 부트 게시판
        • Photogram
        • Baeg-won Clothing Gallery
      • 🥇 Problem Solving
        • Breadth-First Search
        • Depth-First Search
        • Backtracking
        • Simulation
        • Two-pointer
        • Binary Search
        • Greedy
        • Dynamic Programming
        • Minimum Spanning Tree
        • Dijkstra
        • Floyd warshall
      • ☕ Java
        • 명품 자바 에센셜
        • Applications
      • 🍦 JavaScript
        • JavaScript 기초
      • 🐧 Linux
        • 이것이 리눅스다(CentOS 8)
      • 📟 Database
        • 혼자 공부하는 SQL
      • 🧬 Data Structure
      • 🎬 HTML
      • 🎤 Tech Interview
      • 📌 etc
        • Unity 2D Raising Jelly Game
        • C++
        • 영어 쉐도잉
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Baeg-won
[Python] BOJ / 9184번 / 신나는 함수 실행
상단으로

티스토리툴바