def cnt(N): #몇번 옮기는지 세어주는 함수
N_time=1
for i in range(1,N):
N_time=N_time*2+1
print(N_time)
def move(N,start,fin): #어떤 순서로 탑에서 탑으로 이동하는지 나타내주는 함수
wait= list({1,2,3}-{start}-{fin})[0] #1,2,3중에 start와 fin빼고 남는거
if N>=2:
move(N-1,start,wait)
print("{0} {1}".format(start,fin))
move(N-1,wait,fin)
if N==1:
print("{0} {1}".format(start,fin))
disk_num=int(input())
cnt(disk_num) #몇번 움직이는지 먼저 출력
move(disk_num,1,3) #움직이는 과정 출력
문제의 key idea는 move함수에서 볼 수 있듯
N개의 원판을 1번에서 3번 탑으로 옮기는 과정에서는
일단 가장 큰 N번째 원판을 1번에서 3번으로 꺼내기 위해서는
2번 탑에 N-1 높이 탑을 쌓아서 (move(N-1)함수를 1번에서 2번으로 시행하도록 설정)
1번에서 N짜리 큰 원판만 남겨두고 N원판을 1->3으로 옮긴 후
가장 큰 N원판을 3번 탑에 깐 채로 그 위에 N-1높이의 탑을 쌓으면 완성! 이라는 점.
정리하면,
2번 탑에 N-1짜리 높이의 탑 쌓기(move(N-1,start,wait)) ->
1번 탑에 하나 남은 N짜리 큰 원판을 3번에 옮기기 () ->print("{0} {1}".format(start,fin)) 로 대충 처리
2번탑에 있는 N-1 높이 탑을 3으로 옮기기 (move(N-1,wait,fin))
'Python_파이썬설명서 > 백준with파이썬' 카테고리의 다른 글
백준 1181- 단어정렬 (딕셔너리 사용법과 sorted의 lambda 람다) (0) | 2021.07.13 |
---|---|
python에서 ctrl+6 (^)처럼 제곱 표현하기 (0) | 2021.06.24 |
Python 중괄호와 소괄호의 차이 (0) | 2021.06.24 |