๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
4๏ธโƒฃ Python/Problem Solving

[Python Algorithm] ์‹ ๋‚˜๋Š” ํ•จ์ˆ˜ ์‹คํ–‰ BOJ #9184

by seolhee2750 2021. 11. 16.
๋ฌธ์ œ

https://www.acmicpc.net/problem/9184

 

9184๋ฒˆ: ์‹ ๋‚˜๋Š” ํ•จ์ˆ˜ ์‹คํ–‰

์ž…๋ ฅ์€ ์„ธ ์ •์ˆ˜ a, b, c๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. ์ž…๋ ฅ์˜ ๋งˆ์ง€๋ง‰์€ -1 -1 -1๋กœ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์„ธ ์ •์ˆ˜๊ฐ€ ๋ชจ๋‘ -1์ธ ๊ฒฝ์šฐ๋Š” ์ž…๋ ฅ์˜ ๋งˆ์ง€๋ง‰์„ ์ œ์™ธํ•˜๋ฉด ์—†๋‹ค.

www.acmicpc.net

 

๋‚ด ๋ฌธ์ œ ํ’€์ด
memory = [[[0]*21 for _ in range(21)] for __ in range(21)]

def w(a, b, c):
    if (a <= 0) | (b <= 0) | (c <= 0):
        return 1
    if (a > 20) | (b > 20) | (c > 20):
        return w(20, 20, 20)
    if memory[a][b][c]:
        return memory[a][b][c] # ์ด๋ฏธ abc ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” memory ์ž๋ฆฌ์— ๊ฐ’์ด ํ• ๋‹น๋˜์–ด ์žˆ๋‹ค๋ฉด(0์ด ์•„๋‹ˆ๋ผ๋ฉด), ์—ฐ์‚ฐ ํ•„์š” ์—†์œผ๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ memory[a][b][c] ๊ฐ’์„ ๋ฆฌํ„ด!
    if a < b < c:
        memory[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a,  b-1, c)
        return memory[a][b][c]
    memory[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 memory[a][b][c]

while True:
    n = list(map(lambda x: int(x), input().split()))
    if n == [-1, -1, -1]: break
    print(f"w({n[0]}, {n[1]}, {n[2]}) = {w(n[0], n[1], n[2])}")

๐Ÿ‘‰ DP ๋ฌธ์ œ๋กœ, ์ฃผ์–ด์ง„ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ™œ์šฉํ•˜๋Š” ํšจ์œจ์ ์ธ ํ•จ์ˆ˜๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š”๊ฒŒ ํฌ์ธํŠธ!

  • ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋ฅผ ๊ฑฐ์˜ ๋น„์Šทํ•˜๊ฒŒ ๊ฐ€์ ธ์˜ค๊ณ , ๊ฑฐ๊ธฐ์— ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ๋”ํ•ด์ฃผ์—ˆ๋‹ค.
  • a, b, c๊ฐ€ a < b < c ์กฐ๊ฑด๊ณผ, else์— ํ•ด๋‹นํ•˜๋Š” ์กฐ๊ฑด์˜ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์—
    ์ด๋ฏธ memory[a][b][c]์— ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ €์žฅ๋˜์–ด์žˆ๋‹ค๋ฉด, ๊ตณ์ด ์ค‘๋ณต๋œ ์—ฐ์‚ฐ์„ ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ
    ๊ทธ ๋’ค์˜ ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ memory[a][b][c]๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ ํ–ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  memory[a][b][c]์— ๊ทธ๋ƒฅ 0์ด ์ €์žฅ๋˜์–ด์žˆ๊ณ , ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ €์žฅ๋˜์–ด์žˆ์ง€ ์•Š์€ ์ƒํƒœ๋ผ๋ฉด
    ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ๊ฐ๊ฐ์˜ ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜๋Š” ๋ถ€๋ถ„์€ ๋˜‘๊ฐ™์ด ๊ตฌํ˜„ํ•˜๋˜, ๋‹ค์Œ์— ์ค‘๋ณต๋œ ์—ฐ์‚ฐ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ
    memory[a][b][c]์˜ ์ž๋ฆฌ์— ํ•ด๋‹นํ•˜๋Š” ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.

 

๐Ÿ’ก ํ”ผ๋“œ๋ฐฑ
  • ์ฒ˜์Œ์—” ์ด๊ฒŒ ๋ฌด์Šจ ๋ฌธ์  ์ง€,, ์ดํ•ดํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ ธ๋Š”๋ฐ,,
    ๋น„ํšจ์œจ์ ์œผ๋กœ ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ DP ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ํšจ์œจ์ ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค๋Š”.,,?
    ๊ทธ๋Ÿฐ ๋ถ€๋ถ„์„ ๋ณด์—ฌ์ฃผ๋ ค๋Š” ์˜๋„๊ฐ€ ๋‹ด๊ธด ๋ฌธ์ œ์ธ๋“ฏํ•˜๋‹ค.

๋Œ“๊ธ€