sm 기술 블로그

74. 11729(하노이 탑 이동 순서) 본문

문제/백준_파이썬

74. 11729(하노이 탑 이동 순서)

sm_hope 2022. 6. 8. 11:37
N = int(input())


def Hanoi(A, B, C, N):  # A:1 B:2 C:3

    if N == 1:
        print("{0} {1}".format(A, C)) # 처음 print라고 정의함
        return
    Hanoi(A, C, B, N-1)
    print("{0} {1}".format(A, C)) # 마지막 print 라고 정의함
    Hanoi(B, A, C, N-1)


print((2**N)-1)
Hanoi(1, 2, 3, N)

먼저 이동 순서를 한번 보자.

하노이탑 n = 3 일때 위와 같이 이동한다.

어떻게 이동 되는지 이해가 됐는가?

그럼 설명에 들어간다.

 

재귀 함수를 사용하여 하노이탑 문제를 풀어야한다.

기본적으로 총 움직이는 횟수는 2의 들어온 값의 제곱 - 1 이다.  => (( 2**n )-1)

 

그러면 재귀함수가 실행되면서 ABC가 어떻게 되는지 쓰면

 

(1) 처음 1 2 3 => 1 3
(2) 마지막 1 3 2 => 1 2
(3) 처음 3 1 2 => 3 2
(4) 마지막 1 2 3 => 1 3
(5) 처음 2 3 1 => 2 1
(6) 마지막 2 1 3 => 2 3
(7) 처음 1 2 3 => 1 3

 

이렇게 돌아간다.

 

이건 누가 옆에서 얘기해준다고 해도 직접 어떻게 돌아가는지 머리로 생각을 해봐야 이해가 가능하다.

'문제 > 백준_파이썬' 카테고리의 다른 글

76. 2231 (분해합)  (0) 2022.06.09
75. 2798(블랙잭)  (0) 2022.06.08
73. 2447 (별 찍기 - 10)  (0) 2022.06.06
72. 17478 (재귀함수가 뭔가요?)  (0) 2022.06.06
71. 10870(피보나치수열)  (0) 2022.06.06
Comments