반응형
컴퓨터공학과 1학년이라면 누구나 이 탑을 만나봤을 것이다.
1학년 때 알코올로 뇌를 적셔서 기억이 하나도 없는 관계로 이 포스팅을 계기로 한번 정리해보고자한다.
게임의 목적은 다음 두 가지 조건을 만족시키면서, 한 기둥에 꽂힌 원판들을 그 순서 그대로 다른 기둥으로 옮겨서 다시 쌓는 것이다.
1. 한번에 하나의 원판만 옮길 수 있다.
2. 큰 원판이 작은 원판 위에 있어서는 안된다.
이 그림을 보면 쉽게 이해할 수 있다. 이 문제는 재귀 호출을 이용하여 풀 수 있는 가장 유명한 예제 중의 하나이다. 일반적으로 원판이 n개 일 때, 번의 이동으로 원판을 모두 옮길 수 있다.
자, 그럼 어떻게 옮겨야할까?
문제를 유심히 보면 다음 과정이 반복되는 것을 알아챌 수 있다.
1. A에 있는 n-1개의 원판을 C를 이용해서 B로 옮긴다.
2. 가장 큰 원판을 C로 옮긴다.
3. B에 있는 n-1개의 원판을 A를 이용해서 C로 옮긴다.
이를 코드로 작성해보면 아래와 같다.
def hanoi(n, _from, _to, _by) : if n == 1 : print(_from, "->", _to) return hanoi(n-1, _from, _by, _to) print(_from, "->", _to) hanoi(n-1, _by, _to, _from)
출처 : 위키백과 하노이의 탑 https://ko.wikipedia.org/wiki/%ED%95%98%EB%85%B8%EC%9D%B4%EC%9D%98_%ED%83%91
반응형
'0 > algorithm' 카테고리의 다른 글
백준 2042번 구간 합 (Python) (1) | 2018.11.02 |
---|---|
백준 1620번 나는야 포켓몬 마스터 이다솜 (Python) (0) | 2018.11.01 |
백준 9184번 신나는 함수 실행 (Python) (0) | 2018.10.30 |
백준 1992번 쿼드트리 (Python) (1) | 2018.10.29 |
합병 정렬 (Merge sort) (0) | 2018.10.28 |