-
스택 : 하노이 타워Daily Learning/Algorithm 2020. 7. 10. 04:43
■ Tower of Hanoi :: Algorithm of Stack
■ Count of Step :: 2n-1
■ Asymptotic Complexity :: O(2^n)
■ Composite :: 1. Source 2. Auxilary 3. Destination
■ Method :: 1. pop 2. push
하노이타워는 스택알고리즘을 설명할 때 자주 사용된다.
알고리즘의 조건은 다음과 같다.
1. A , B , C 세 기둥에서 N개의 원판이 있다.
2. A 기둥에 크기순으로 쌓여있는 원판을 C 기둥에 쌓아야 한다.
3. 원판은 크기순으로만 쌓을 수 있다. ( 더 큰 원판을 위에 두지 못한다. )
위 조건을 해석하면 다음 논리를 이해할 수 있다.
1. ( 스택구조 ) :: 가장 큰 원판을 먼저 C에 옮겨야한다. 즉, 위쪽원판 ( 나중에 쌓인 원판 )을 먼저 보조기둥에 옮겨야한다.
2. ( 재귀방식 ) :: 하나를 옮기면 N-1개 의 원판의 상황이 된다.
결과적으로 Source( 초기 ) 기둥에서 Destination( 목적 ) 기둥으로 원판을 옮길때,
최하층 원판을 옮긴 상황은 N-1 개의 원판을 옮겨야할 때의 상황과 같고,
Source 와 Auxilary( 보조 ) 기둥이 바뀐 상황인 것이다.
이때, 최하층을 제외한 원판을 옮기는 횟수 1, 최하층 원판을 옮기는 횟수는 1
총 2회를 움직이면 N-1 일떄 옮기는 횟수만 남는 방식이다.
즉 맨 마지막 원판을 옮기기 위해서는 2회를 움직여야하므로 2N 비율로 상승하며,
1개의 원판일때는 예외적으로 1회를 옮기므로 2(N-1) +1 이라는 방정식이 도출된다.
이를 다 더한 값이 전체 이동횟수이므로 각항이 2N-1 방정식을 따르는 등비수열이다.
정리하면 N번째 밑의 원판을 옮기기 위한 동작은 2N-1
전체 N개의 원판을 옮겨야 하므로 각 N번쨰 원판동작을 합치면,
이는 등비수열이므로 2^N +1, 즉 O(2^N)라는 빅오를 따르게된다.
pseudo code 로 정리하면
func( n ) {
return ( n == 1 ? 1 : func( n -1 ) + 1 )
}
아래의 테스트에서 확인해보자.
https://www.acmicpc.net/problem/11729
11729번: 하노이 탑 이동 순서
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로
www.acmicpc.net