[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)
    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€