11729_하노이 탑
Python/백준

11729_하노이 탑

728x90

문제는 더보기!

 

더보기

문제

세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로 옮기려 한다.

  1. 한 번에 한 개의 원판만을 다른 탑으로 옮길 수 있다.
  2. 쌓아 놓은 원판은 항상 위의 것이 아래의 것보다 작아야 한다.

이 작업을 수행하는데 필요한 이동 순서를 출력하는 프로그램을 작성하라. 단, 이동 횟수는 최소가 되어야 한다.

아래 그림은 원판이 5개인 경우의 예시이다.

어떻게보면 많은 사람들이 알 하노이 탑 문제이다!

 

재귀함수로 어떻게 풀까.. 고민을 하다가 문제를 쪼개푸는것에 집중해서 생각해보니 풀렸다.

 

내가 만약 3개의 원반을 옮기기 위해서는, 위의 2개의 원반을 한덩어리로 생각을 해 보았다. 즉, 내가 옮겨야 하는 원반이 몇개이던 위의 개수가 1개라고 생각해보자

 

그렇다면 1번에서 3번라인으로 옮기는건 쉬운문제가 된다. 1번칸을 2번으로 그리고 옮길 마지막 원반을 3번으로 그후에 2번에 있는 원판을 3번으로 옮기면 된다.

 

자 그렇다면 1번에서 2번으로 원반을 옮기는 문제로 변하게 된다. 근데 이 문제는 또 1번에서 2번으로 옮기는 원판의 마지막을 빼고보면 위에서 설명한것과 같은 원리로 동작하게 된다. 완벽히 재귀적으로 풀기 좋은 문제이다.

 

그래서 나는 함수의 인자로 시작점,옮길점,현재가장무거운 원반 을 넣고 구현해 보았다. 

 

 

lst=[]
def f(start,end,N):
    if N==1:
        lst.append([start,end])
    else:
        f(start,6-start-end,N-1)
        lst.append([start,end])
        f(6-start-end,end,N-1)

f(1,3,int(input()))
print(len(lst))
for i in lst:
    print(i[0],i[1])

 

내 위의 원판들을 임시로 놔둘 공간이 필요했는데, 생각해보니까 1,2,3의 합이 6이길래 거기서 시작점과 끝점을 빼면 무조건 빈칸의 판이 나온다는게 생각나서 구현해보았다!

 

 

728x90

'Python > 백준' 카테고리의 다른 글

2798_블랙잭  (0) 2021.11.25
2447_별찍기 -10  (0) 2021.11.23
10250_ACM호텔  (0) 2021.11.20
2775_부녀회장이 될테야  (0) 2021.11.20
10870_피보나치 수열  (0) 2021.11.20