1914 - ํ๋ ธ์ด ํ
by yuyeol3, 2025-03-28
๐ ์ํ์ ๊ท๋ฉ๋ฒ์ ํตํ ์ฌ๊ท๋ฅผ ์ฌ์ฉํ๋ฉด ํ ์ ์๋ ๋ฌธ์ ์ด๋ค.
n = 1์ธ ๊ฒฝ์ฐ
์์์ ์ ์ํ์ด ํ๋ ์๋ค๋ฉด ๋ฐ๋ก ๋ชฉ์ ์ง๋ก ์ฎ๊ธฐ๋ฉด ๋๋ค. ์ฆ ํ ๋ฒ์ ์ด๋์ผ๋ก ์ฎ๊ธธ ์ ์๋ค.
n = k์ผ๋ ์ฎ๊ธธ ์ ์๋ค๊ณ ๊ฐ์ ํ๊ณ , n = k+1์ผ ๊ฒฝ์ฐ
์ํ์ด k์ผ๋ ๋์ฐฉ์ง๋ก ๋ชจ๋ ์ฎ๊ธธ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ค. ํํธ, ํ๋ ธ์ด ํ์ ๊ท์น์ ํฐ ์ํ์ด ์์ ์ํ ์์ ์ค์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ ์ด ๊ท์น์ ๋ง๊ฒ k๊ฐ์ ์ํ์ ์์ ์์น์ ์ฎ๊ธด ๋ค์, ์ ์ผ ํฐ ์ํ์ ๋์ฐฉ์ง๋ก ์ฎ๊ธฐ๊ณ , ๋๋จธ์ง ์ํ์ ์์ ์์น์์ ๋์ฐฉ์ง๋ก ์ฎ๊ธฐ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
์ด๋ ํ์์ ๋ํ ์ผ๋ฐํญ
W(1) = 1 W(2) = 2W(1) + 1 = 3 W(3) = 2W(2) + 1 = 7 W(4) = 2W(3) + 1 = 15 W(5) = 2W(4) + 1 = 31 ... W(n) = 2W(n-1) + 1
์ ์ผ๋ฐํญ์ ์ํ์ ๊ท๋ฉ๋ฒ์ผ๋ก ์ฆ๋ช ํด ๋ณด์
- Base Case (n = 1)
- ์ธ ์ ๋ํด ์ฑ๋ฆฝํ๋ค๊ณ ๊ฐ์ ํ ๋ ์ ์ผ๋ก ์์ด ์ฑ๋ฆฝํ๋ค.
DP ์ฌ์ฉ
์ ๋ฐฉ์๋ง์ผ๋ก๋ ์ด ํ
์คํธ์ผ์ด์ค ๋ฒ์ ๋ด์์ ๋ฌธ์ ๋ฅผ ์ถฉ๋ถํ ํด๊ฒฐํ ์ ์๋ค. ํ์ง๋ง ์ฝ๋๋ฅผ ๋ ์ต์ ํํ๊ธฐ ์ํด ๋ฉ๋ชจ์ด์ ์ด์
๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค. ํ์ด์ฌ dict ์๋ฃ๊ตฌ์กฐ๋ฅผ ํตํด f"{n},{start},{end},{via}"๋ฅผ ํค๋ก ์ฌ์ฉํ์ฌ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ , ์ค๋ณต ๊ณ์ฐ์ ๋ฐฉ์งํ๋ฏ๋ก์จ ์ฝ๋๋ฅผ ์ต์ ํํ ์ ์์๋ค.
์ฝ๋
import sys dp = {} def hanoi(n, start, end, via): if (n == 1): return f"{start} {end}\n" if (f"{n},{start},{end},{via}" in dp): return dp[f"{n},{start},{end},{via}"] res = "" res += hanoi(n-1, start, via, end) res += f"{start} {end}\n" res += hanoi(n-1, via, end, start) dp[f"{n},{start},{end},{via}"] = res return res n = int(sys.stdin.readline()) sys.stdout.write(f"{(2**n)-1}\n") if (n <= 20): sys.stdout.write(hanoi(n, 1, 3, 2))
๋๊ธ ๋ถ๋ฌ์ค๋ ์ค...