[BOJ] 11729 ํ•˜๋…ธ์ด ํƒ‘ ์ด๋™ ์ˆœ์„œ (Python, Recursion)

๋ฐ˜์‘ํ˜•

๐ŸŒฑ ๋ฌธ์ œ

 

11729๋ฒˆ: ํ•˜๋…ธ์ด ํƒ‘ ์ด๋™ ์ˆœ์„œ

์„ธ ๊ฐœ์˜ ์žฅ๋Œ€๊ฐ€ ์žˆ๊ณ  ์ฒซ ๋ฒˆ์งธ ์žฅ๋Œ€์—๋Š” ๋ฐ˜๊ฒฝ์ด ์„œ๋กœ ๋‹ค๋ฅธ n๊ฐœ์˜ ์›ํŒ์ด ์Œ“์—ฌ ์žˆ๋‹ค. ๊ฐ ์›ํŒ์€ ๋ฐ˜๊ฒฝ์ด ํฐ ์ˆœ์„œ๋Œ€๋กœ ์Œ“์—ฌ์žˆ๋‹ค. ์ด์ œ ์ˆ˜๋„์Šน๋“ค์ด ๋‹ค์Œ ๊ทœ์น™์— ๋”ฐ๋ผ ์ฒซ ๋ฒˆ์งธ ์žฅ๋Œ€์—์„œ ์„ธ ๋ฒˆ์งธ ์žฅ๋Œ€๋กœ

www.acmicpc.net

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

 

๐ŸŒฑ ํ’€์ด

๋ฐ”ํ‚น๋…๋‹˜์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ•์˜ ์˜์ƒ์˜ ํ’€์ด๋ฒ•์„ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ์„ , ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ n๋ฒˆ์งธ ์›ํŒ์„ 1๋ฒˆ ์žฅ๋Œ€์—์„œ 3๋ฒˆ ์žฅ๋Œ€๋กœ ์˜ฎ๊ธฐ๊ธฐ ์œ„ํ•œ ๊ณผ์ •์„ ์ƒ๊ฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1. n-1๊ฐœ์˜ ์›ํŒ์„ 1๋ฒˆ์—์„œ 2๋ฒˆ ์žฅ๋Œ€๋กœ ์˜ฎ๊ธด๋‹ค.

 

2. n๋ฒˆ ์›ํŒ์„ 1๋ฒˆ์—์„œ 3๋ฒˆ ์žฅ๋Œ€๋กœ ์˜ฎ๊ธด๋‹ค.

 

3. n-1๊ฐœ์˜ ์›ํŒ์„ 2๋ฒˆ์—์„œ 3๋ฒˆ ์žฅ๋Œ€๋กœ ์˜ฎ๊ธด๋‹ค.

 

์ด๋ฅผ ๊ท€๋‚ฉ์ ์œผ๋กœ ์„ค๋ช…ํ•˜๋ฉด, ์›ํŒ n-1๊ฐœ๋ฅผ ์žฅ๋Œ€ a๋ฒˆ์—์„œ ์žฅ๋Œ€ b๋ฒˆ์œผ๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์›ํŒ n๊ฐœ๋ฅผ ์žฅ๋Œ€ a'์—์„œ ์žฅ๋Œ€ b'๋ฒˆ์œผ๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. 

๋”ฐ๋ผ์„œ ์›ํŒ n๊ฐœ๋ฅผ a๋ฒˆ ์žฅ๋Œ€์—์„œ b๋ฒˆ ์žฅ๋Œ€๋กœ ์˜ฎ๊ธฐ๋Š” ํ•จ์ˆ˜๋ฅผ ์žฌ๊ท€์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. n-1๊ฐœ์˜ ์›ํŒ์„ ์žฅ๋Œ€ a์—์„œ ์žฅ๋Œ€ 6-a-b๋กœ ์˜ฎ๊ธด๋‹ค.
2. n๋ฒˆ ์›ํŒ์„ ์žฅ๋Œ€ a์—์„œ b๋กœ ์˜ฎ๊ธด๋‹ค.
3. n-1๊ฐœ์˜ ์›ํŒ์„ ์žฅ๋Œ€ 6-a-b์—์„œ b๋กœ ์˜ฎ๊ธด๋‹ค.

์žฌ๊ท€ ํ•จ์ˆ˜์˜ base condition์€ n์ด 1์ผ ๋•Œ์—๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ณณ์œผ๋กœ ๋ฌด์กฐ๊ฑด ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์žฅ๋Œ€ a์—์„œ b๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์„ ์ถœ๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


  
def hanoi(n, a, b):
if n == 1:
movements.append((a, b))
return
hanoi(n-1, a, 6-a-b)
movements.append((a, b))
hanoi(n-1, 6-a-b, b)
  • hanoi(n, a, b)๋Š” ์›ํŒ n๊ฐœ๋ฅผ ์žฅ๋Œ€ a์—์„œ b๋กœ ์˜ฎ๊ธฐ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ์œ„์—์„œ ์„ค๋ช…ํ•œ 3๊ฐœ์˜ ๋‹จ๊ณ„๋ฅผ ๊ทธ๋Œ€๋กœ ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€๊ณ , base condition ๋˜ํ•œ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

๐ŸŒฑ ์ •๋‹ต ์ฝ”๋“œ


  
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# boj 11729 ํ•˜๋…ธ์ดํƒ‘
n = int(input())
count = 0
movements = []
def hanoi(n, a, b):
if n == 1:
movements.append((a, b))
return
hanoi(n-1, a, 6-a-b)
movements.append((a, b))
hanoi(n-1, 6-a-b, b)
hanoi(n, 1, 3)
print(len(movements))
for move in movements:
print(*move)
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€