본문 바로가기

Algorithm & Data Structure

백준 - 11729번(재귀)

728x90
반응형

https://www.acmicpc.net/problem/11729

 

11729번: 하노이 탑 이동 순서

세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로

www.acmicpc.net

import sys

n = int(sys.stdin.readline())

def rec(n, a, b, c):
  if(n == 1):
    print(a, c, sep = " ")
  else:
    rec(n-1, a, c, b)
    rec(1, a, b, c)
    rec(n-1, b, a, c)

count = 2**n -1
print(count)
rec(n,1,2,3)

재귀를 이용한 하노이탑 문제다.

아이디어는 이렇다.

 

1. 원판이 1개라면? -> 1에서 3번으로 바로 이동

2. 원판이 2개라면? -> 가장 위의 원판을 2번에 옮겨놓으면 원판이 한개인 문제와 동일

3. 원판이 3개라면? -> 여기서 부터 조금 복잡하지만 2번을 생각해 보면 위에 두개를 2번에 옮겨놓기만 하면 1번 + 2번 문제가 된다.

그럼 2번으로 어떻게 옮기느냐? 1에서 3번으로 이동 1에서 2번으로 이동 3번에서 2번으로 이동 하면 된다.

 

n == 1일때 위의 순서에서 1번과 같은 상황이므로 종료 조건이다.

 

그럼 이제 최소 횟수를 생각해보자 n=1 -> 1회, n=2 -> 3회, n=3 -> 7회

 

번째 원반을 한쪽 기둥으로 옮기는 데 필요한 최소 횟수를 an라고 하자. 

번째 원반을 옮기려면(an+1을 구하려면) n번째 까지의 원반을 한쪽 기둥으로 옮기고(an를 더하고) 번째 원반을 비어있는 기둥에 옮기고(1을 더하고) 번째까지의 원반을 번째 원반 위로 옮기면(an 다시 더하면)된다.

 

a1​=1, an+1 ​ =2an​+1 을 만족하고 결론적으로 최소 횟수는 2**n -1 이 된다.

 

노베이스 상태에서 이런 아이디어를 바로 떠올리는건 어렵고 Well- Known 문제라서 난이도가 비교적 낮게 책정된 문제라고 생각한다. 

728x90
반응형

'Algorithm & Data Structure' 카테고리의 다른 글

백준 - 2448번(재귀)  (0) 2022.04.28
백준 - 2630번(재귀)  (0) 2022.04.28
백준 - 16236번(BFS,구현)  (0) 2022.04.10
백준 - 7576번(BFS)  (0) 2022.04.09
백준 - 2178번(BFS)  (0) 2022.04.09