티스토리 뷰
<문제 링크>
11729번: 하노이 탑 이동 순서
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로
www.acmicpc.net
<문제 풀이>
def hanoi(n, s, e): #hanoi(n개의 원판, 시작 장대, 도착 장대)
if n == 1 : #원판이 1개인 경우
print(s, e)
return
hanoi(n - 1, s, 6 - s - e) #n-1개의 원판 중간 장대로 이동
print(s, e) #가장 큰 원판 도착 장대로 이동
hanoi(n - 1, 6 - s - e, e) #n-1개의 원판 도착 장대로 이동
N = int(input())
print(2**N - 1) #옮긴 횟수
hanoi(N, 1, 3) #수행 과정
*key point: 하노이의 탑 최소 이동은 N-1개의 원판을 옮기고 가장 큰 원판을 옮긴 뒤 다시 N-1개의 원판을 그 위로 올린다는 간단한 원리로 구현가능하다. 점화식을 세워 일반항을 구해보면 옮긴 횟수는 2^N-1이 된다.
*reference: https://namu.wiki/w/%ED%95%98%EB%85%B8%EC%9D%B4%EC%9D%98%20%ED%83%91
'What I Learned > Algorithm Practice' 카테고리의 다른 글
[백준 - python] 2231번: 분해합 (0) | 2022.10.09 |
---|---|
[백준 - python] 2798번: 블랙잭 (0) | 2022.10.09 |
[백준 - python] 2447번: 별 찍기 - 10 (0) | 2022.10.06 |
[백준 - python] 24060번: 알고리즘 수업 - 병합 정렬 1 (3) | 2022.10.06 |
[백준 - python] 25501번: 재귀의 귀재 (0) | 2022.10.03 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 항해+
- 24313
- 13241
- 13909
- Wil
- 1269
- 24060
- 20920
- 5597
- 2587
- 17103
- Python
- 26069
- 25192
- SQL
- 2903
- til
- 항해 플러스
- programmer
- 2053
- 24723
- Programmers
- 4134
- 백준
- 벡준
- 10807
- 25501
- 2738
- MySQL
- 코육대
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함