0w0
[백준] 11729 하노이 탑 이동 순서 본문
728x90
반응형
문제
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로 옮기려 한다.
- 한 번에 한 개의 원판만을 다른 탑으로 옮길 수 있다.
- 쌓아 놓은 원판은 항상 위의 것이 아래의 것보다 작아야 한다.
이 작업을 수행하는데 필요한 이동 순서를 출력하는 프로그램을 작성하라. 단, 이동 횟수는 최소가 되어야 한다.
아래 그림은 원판이 5개인 경우의 예시이다.
입력
첫째 줄에 첫 번째 장대에 쌓인 원판의 개수 N (1 ≤ N ≤ 20)이 주어진다.
출력
첫째 줄에 옮긴 횟수 K를 출력한다.
두 번째 줄부터 수행 과정을 출력한다. 두 번째 줄부터 K개의 줄에 걸쳐 두 정수 A B를 빈칸을 사이에 두고 출력하는데, 이는 A번째 탑의 가장 위에 있는 원판을 B번째 탑의 가장 위로 옮긴다는 뜻이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#coding=utf-8
# 문제
#
# 세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로 옮기려 한다.
#
# 한 번에 한 개의 원판만을 다른 탑으로 옮길 수 있다.
# 쌓아 놓은 원판은 항상 위의 것이 아래의 것보다 작아야 한다.
#
# 이 작업을 수행하는데 필요한 이동 순서를 출력하는 프로그램을 작성하라. 단, 이동 횟수는 최소가 되어야 한다.
#
# 입력
#
# 첫째 줄에 첫 번째 장대에 쌓인 원판의 개수 N (1 ≤ N ≤ 20)이 주어진다.
#
# 출력
#
# 첫째 줄에 옮긴 횟수 K를 출력한다.
#
# 두 번째 줄부터 수행 과정을 출력한다. 두 번째 줄부터 K개의 줄에 걸쳐 두 정수 A B를 빈칸을 사이에 두고 출력하는데, 이는 A번째 탑의 가장 위에 있는 원판을 B번째 탑의 가장 위로 옮긴다는 뜻이다.
# 이제 하노이 탑을 소스 코드로 만들어보자.
#
# 1. n 개의 원반이 있을 때 n - 1개의 원반은 첫 번째 칸에서 두 번째 칸으로 이동한다.
#
# hanoi(n - 1, from, to, by)
#
# 2. n 번째 원반을 첫 번째 칸에서 세 번째 칸으로 옮긴다.
#
# move(from, to)
#
# 3. 두 번째 칸에 있는 n - 1개의 원반을 세 번째 칸으로 이동한다.
#
# hanoi(n - 1, by, from, to)
# def T(N, Beg, Aux, End):
# if N == 1:
# print(Beg, '->', End)
#
# else:
# T(N-1, Beg, End, Aux)
# T(1, Beg, Aux, End)
# T(N-1, Aux, Beg, End)
import sys
input=sys.stdin.readline
move_cnt=0
move_log=[]
def move(x, first_stick, second_stick, third_stick):
if x==1:
move_log.append([first_stick,third_stick])
#print(first_stick, third_stick)
return
else:
move(x-1, first_stick, third_stick, second_stick) #세번째 스틱을 보조로 첫번째 스틱에서 두번째 스틱으로 옮김. x를 줄여가며 남은 원반이 1이 될때까지 재귀
move(1,first_stick, second_stick, third_stick) #x==1을 주어서 원반의 이동을 출력하기위해서 재귀함수 호출(이동 기록)
move(x-1, second_stick, first_stick, third_stick) #두번째 스틱으로 넘긴 원반을 첫번째 스틱을 보조로 세번째 스틱으로 옮김. x를 줄여가며 남은 원반이 1이 될까지 재귀
disk=int(input())
move(disk,1,2,3)
print(len(move_log))
for i in range(0,len(move_log)):
for j in range(0,2):
print(move_log[i][j],"",end='')
print()
|
cs |
728x90
반응형
'Coding > 백준 python solve' 카테고리의 다른 글
[백준] 11720 숫자의 합 (0) | 2019.08.12 |
---|---|
[백준] 11654 아스키 코드 (0) | 2019.08.12 |
[백준] 2447 별 찍기 - 10 X (0) | 2019.08.12 |
[백준] 10872 팩토리얼 (0) | 2019.08.12 |
[백준] 1065 한수 (0) | 2019.08.12 |
Comments