윤굥굥
yg323
윤굥굥
전체 방문자
오늘
어제
  • 굥굥 DEV
    • Computer Science
      • 자료구조 및 알고리즘
      • 운영체제
      • 네트워크
      • 데이터베이스
    • Programming Language
      • Java
      • Kotlin
    • Android
      • with Kotlin
    • Algorithm
      • with Kotlin
    • 하나씩 습득하는 중

블로그 메뉴

  • ↓백준 모아보기 ↓
  • 💚 플레티넘 문제 모아보기
  • 💛 골드 문제 모아보기
  • 🤍 실버 문제 모아보기
  • 🤎 브론즈 문제 모아보기

공지사항

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.
윤굥굥
Algorithm/with Kotlin

[백준][코틀린] 9184 신나는 함수

Algorithm/with Kotlin

[백준][코틀린] 9184 신나는 함수

2022. 2. 19. 13:37

문제 내용

문제

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

다음과 같은 재귀함수 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)를 출력하는 프로그램을 작성하시오.

입력

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

출력

입력으로 주어진 각각의 a, b, c에 대해서, w(a, b, c)를 출력한다.

예제 입력 예제 출력
1 1 1
2 2 2
10 4 6
50 50 50
-1 7 18
-1 -1 -1
w(1, 1, 1) = 2
w(2, 2, 2) = 4
w(10, 4, 6) = 523
w(50, 50, 50) = 1048576
w(-1, 7, 18) = 1

문제 풀이

문제 조건에서 첫번째 조건과 두번째 조건은 범위를 벗어났을때 저렇게 처리해라~ 라고 명시한 것이고, 밑의 두개의 조건이 값이 0~20일때 어떻게 계산할지 나타낸 것이다. 따라서, 우선 3중 배열을 만드는데 여기다가 초깃값으로 1을 지정해준다. 왜냐면 0이 포함된게 있으면 다 1이니까!

그러고 나서, 삼중 for문을 도는데 이때, 만약 a< b < c 이면 (b가 a+1..c 범위 안에 있을때로 변경 가능) 세번째 조건에 맞게 계산하고 나머지의 경우 4번째 조건을 맞추면 된다.

그러고나서 입력 값을 받으면서 문제 조건에 따라 출력하면 되는 간단한 문제였다!

</>̆̈ 코드

fun main() {
    val br = System.`in`.bufferedReader(); val bw = System.out.bufferedWriter()
    val dp = Array(21) {Array(21) {IntArray(21) {1} } }
    for (a in 1 .. 20) {
        for (b in 1 ..  20) {
            for (c in 1 .. 20) {
                if (b in (a + 1) until c) dp[a][b][c] = dp[a][b][c-1] + dp[a][b-1][c-1] - dp[a][b-1][c-1]
                else dp[a][b][c] = dp[a-1][b][c] + dp[a-1][b-1][c] + dp[a-1][b][c-1] - dp[a-1][b-1][c-1]
            }
        }
    }
    var line = br.readLine()

    while (line != "-1 -1 -1") {
        val (a, b, c) = line.split(" ").map { it.toInt() }
        if (a <= 0 || b<=0 || c<=0 ) bw.write("w($a, $b, $c) = 1\n")
        else if (a > 20 || b > 20 || c>20) bw.write("w($a, $b, $c) = ${dp[20][20][20]}\n")
        else bw.write("w($a, $b, $c) = ${dp[a][b][c]}\n")
        line = br.readLine()
    }

    bw.close()
}

링크

 

9184번: 신나는 함수 실행

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

www.acmicpc.net

 

저작자표시 비영리 변경금지 (새창열림)
  • 문제 내용
  • 문제 풀이
  • </>̆̈ 코드
  • 링크
'Algorithm/with Kotlin' 카테고리의 다른 글
  • [백준][코틀린] 1149 RGB 거리
  • [백준][코틀린] 1904 01타일
  • [백준][코틀린] 1003 피보나치 함수
  • [백준][코틀린] 9576 책 나눠주기
윤굥굥
윤굥굥

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.