μ•Œκ³ λ¦¬μ¦˜ 문제/BOJ_Python

[BOJ/Step15] 9184 : μ‹ λ‚˜λŠ” ν•¨μˆ˜ μ‹€ν–‰ (Python)

NaNaRinπŸ™ƒ 2021. 2. 22. 22:25

www.acmicpc.net/problem/9184

 

9184번: μ‹ λ‚˜λŠ” ν•¨μˆ˜ μ‹€ν–‰

μž…λ ₯은 μ„Έ μ •μˆ˜ a, b, c둜 이루어져 있으며, ν•œ 쀄에 ν•˜λ‚˜μ”© 주어진닀. μž…λ ₯의 λ§ˆμ§€λ§‰μ€ -1 -1 -1둜 λ‚˜νƒ€λ‚΄λ©°, μ„Έ μ •μˆ˜κ°€ λͺ¨λ‘ -1인 κ²½μš°λŠ” μž…λ ₯의 λ§ˆμ§€λ§‰μ„ μ œμ™Έν•˜λ©΄ μ—†λ‹€.

www.acmicpc.net


이게 λŒ€μ²΄ μ–΄λ–»κ²Œ ν’€μ–΄μ•Ό λ˜λŠ” 건지 점화식을 μ°Ύμ•„μ„œ μ–΄λ–»κ²Œ ν•΄μ•Όλ˜λŠ”κ±΄κ°€

w(20, 20, 20) λΆ€ν„° ν•˜λ‚˜ν•˜λ‚˜ μ†μœΌλ‘œ ν’€μ–΄μ“°λŠ”λ° 아무리 심해도 λŒ€μ²΄ 이딴 λ¬Έμ œμΌλ¦¬κ°€ μ—†κ² λ‹€ μ‹Άμ–΄μ„œ ꡬ글링..

 

ν–ˆλ”λ‹ˆ λ©”λͺ¨μ΄μ œμ΄μ…˜? μ΄λΌλŠ” 게 λ‚˜μ˜€λŠ”λ° 세상에 ko.wikipedia.org/wiki/λ©”λͺ¨μ΄μ œμ΄μ…˜

μ•½κ°„ 혁λͺ…μ΄μ—ˆμŒ λ‡Œ κΉ¨λ—ν•΄μ§€λŠ” λŠλ‚Œ.?

 

1. a, b, cλ²”μœ„κ°€ ν•˜λ‚˜λΌλ„ 0 μ΄ν•˜μ΄λ©΄ 1을 λ°˜ν™˜ν•˜κ³  ν•˜λ‚˜λΌλ„ 20 이상이면 w(20, 20, 20)을 ν˜ΈμΆœν•˜κΈ° λ•Œλ¬Έμ— μ΅œλŒ€ λ²”μœ„λŠ” 20

  1-1. ww[20][20][20]κΉŒμ§€μ˜ 리슀트λ₯Ό μƒμ„±ν•œλ‹€

2. a, b, cλ₯Ό μž…λ ₯λ°›μ•„ μ…‹ λ‹€ -1이면 while문을 νƒˆμΆœ

3. w(a, b, c) 호좜

  3-1. a, b, c 의 λ²”μœ„ 확인 (0 <= a, b, c <= 20)

  3-2. ww[a][b][c] κ°’ 확인. 0이 μ•„λ‹λ•Œλ§Œ λ°˜ν™˜

  3-3. a < b < c 이면 w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c) λ°˜ν™˜ => μž¬κ·€

  3-4. μœ„ 어디에도 μ†ν•˜μ§€ μ•ŠμœΌλ©΄ w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1) λ°˜ν™˜ => μž¬κ·€

 

미리 리슀트λ₯Ό μƒμ„±ν•˜κ³  값을 λ„£λŠ”λ‹€..

3-2번이 μ§„μ§œ 와 λŒ€λ°•μž„ μ–΄λ–»κ²Œ 이런 생각을 γ…‹γ…‹γ…‹γ…‹γ…‹... λ‚œ 아직 λ©€μ—ˆλ‹€

 

# 9184.py

ww = [[[0] * 21 for _ in range(21)] for __ in range(21)]


def w(x, y, z):
    if x <= 0 or y <= 0 or z <= 0:
        return 1
    if x > 20 or y > 20 or z > 20:
        return w(20, 20, 20)
    if ww[x][y][z]:
        return ww[x][y][z]
    if x < y < z:
        ww[x][y][z] = w(x, y, z-1) + w(x, y-1, z-1) - w(x, y-1, z)
        return ww[x][y][z]
    ww[x][y][z] = w(x-1, y, z) + w(x-1, y-1, z) + w(x-1, y, z-1) - w(x-1, y-1, z-1)
    return ww[x][y][z]


while True:
    a, b, c = map(int, input().split())
    if a == -1 and b == -1 and c == -1:
        break

    print(f'w({a}, {b}, {c}) = {w(a, b, c)}')

 

근데 λ†€λΌμš΄ μ‚¬μ‹€
κ·Έλƒ₯ μˆ«μž μ„Έκ°œλ§Œ μž…λ ₯λ°›λŠ”κ±°λΌ ν° μ°¨μ΄ μ—†μ„쀄 μ•Œμ•˜λŠ”데
input()ν•¨μˆ˜ μ“°λŠ”κ±°λž‘ readline()ν•¨μˆ˜ μ“°λŠ”κ±°λž‘ μ°¨μ΄ μ—„μ²­λ‚˜λ‹€..

λ¬Όλ‘  readline()이 μ—΄λ°° λΉ λ₯΄λ‹€ γ…Ž