Python - 알고리즘 (하노이 탑)

2024. 2. 28. 17:15·IT/Python

하노이 탑

하노이라길래 베트남인줄 알았는데 고대 인도 베나레스에 있는 한 사원 이야기란다.
64개의 원반을 처음 놓여 있던 막대에서 다른 막대로 모두 옮기면 탑은 무너지고 세상의 종말이 온다고 한다.
세상을 종말 시켜보자.

하노이 탑의 규칙은 아래와 같다.

  1. 한 번에 하나의 원판만 이동할 수 있습니다.
  2. 원판은 탑의 맨 위에서만 이동할 수 있습니다.
  3. 작은 원판 위에 큰 원판이 올라갈 수 없습니다.

이를 풀기위한 기본 아이디어는 재귀적 접근 방식
즉 큰 문제를 더 작은 문제로 나누어 해결
뭔말이냐?
-> n-1개의 원핀을 사용해 문제를 해결한 다음 가장 큰 원판을 도착지점으로 이동
그리고 다시 n-1개의 원판을 가장 큰 원판 위로 이동시키는 과정을 반복하는 것

하노이의 탑을 풀기 위해서 우선 재귀함수에 대해서 알아야함
재귀함수란 함수에서 자기 자신을 다시 호출해 작업을 수행하는 방식임

재귀함수란?


나 자신을 다시 호출하는 것

  • 잘쓰면 코드를 효율적으로 관리할 수 있다.

별찍기

def recusion(num):
    if num > 0:
        print('*' * num)
        return recusion(num -1)

    else:
        return 1

recusion(10)

10! 구하기

def factorial(num):
    if num > 0:
        return num * factorial(num-1)
    else:
        return 1

print(f'factorial(10) : {factorial(10)}')


이제 문제를 풀어보자

            # 원판 개수, 출발 기둥, 도착 기둥, 경유 기둥
def moveDisc(discCnt, fromBar, toBar, viaBar):
    if discCnt == 1:
        print(f'{discCnt}disc를 {fromBar}에서 {toBar}으로 이동!')

    else:
        # (disCnt-1) 개들을 경유 기둥으로 이동
        moveDisc(discCnt-1,fromBar, viaBar, toBar)

        #disCnt를 목적 기둥으로 이동
        print(f'{discCnt} disc를 {fromBar}에서 {toBar}으로 이동!')

        # {disCnt-1}개들을 도착 기둥으로 이동
        moveDisc(discCnt-1,viaBar,toBar, fromBar)

moveDisc(3 ,1 ,3 ,2) #3개의 원판을 1번 기둥에서 시작해서 3번기둥까지 옮기는데 경유기동은 2번이다.

코드를 실행하면 moveDisc(discCnt-1,fromBar, viaBar, toBar)를 실행했을때

(3, 1, 3, 2) -> 2, 1, 2, 3

(2, 1, 2, 3) -> 1, 1, 3, 2

(1, 1, 3, 2) ->             #  1-1 = 0이니까  if discCnt == 1:만남

이렇게 되고

if discCnt == 1:만나니까 쭉 실행하면
print(f'{discCnt}disc를 {fromBar}에서 {toBar}으로 이동!')을 먼저 만나고
다음 print(f'{discCnt} disc를 {fromBar}에서 {toBar}으로 이동!')을 만남

(3, 1, 3, 2) -> 2, 1, 2, 3  -> 3disc를 1에서 3으로 이동 (4)

(2, 1, 2, 3) -> 1, 1, 3, 2 -> 2disc를 1에서 2로 이동 (2)

(1, 1, 3, 2) ->  1disc를 1에서 3으로 이동 (1)

(2, 1, 2, 3) -> 1, 3, 2, 1

(1, 3, 2, 1) ->  1disc를 3에서 2로 이동 (3)

(3, 1, 3, 2)

실행순서

반응형
저작자표시 비영리 변경금지 (새창열림)

'IT > Python' 카테고리의 다른 글

Python - 알고리즘 (최댓값,최솟값,최빈값,근삿값,평균)  (0) 2024.02.27
Python - 알고리즘 (버블정렬,삽입정렬,선택정렬)  (1) 2024.02.26
Python - 알고리즘 (순위)  (0) 2024.02.26
Python - 알고리즘 (선형검색,이진검색)  (1) 2024.02.26
Python - 자료구조  (0) 2024.02.22
'IT/Python' 카테고리의 다른 글
  • Python - 알고리즘 (최댓값,최솟값,최빈값,근삿값,평균)
  • Python - 알고리즘 (버블정렬,삽입정렬,선택정렬)
  • Python - 알고리즘 (순위)
  • Python - 알고리즘 (선형검색,이진검색)
생각 기록실
생각 기록실
AI(LLM)와 서비스 기획을 공부하며 작성하는 기술 블로그입니다. (feat. 영화리뷰를 곁들인..)
    반응형
  • 생각 기록실
    이러쿵 저러쿵
    생각 기록실
  • 전체
    오늘
    어제
  • 링크

    • Github
    • LindeIn
    • 분류 전체보기 (115)
      • 이러쿵 저러쿵 (5)
      • 정보통계 (7)
        • 데이터마이닝 (2)
        • 금융공학 (4)
      • IT (26)
        • Python (10)
        • AWS (5)
        • Github (2)
        • Project (8)
      • 리뷰 (29)
        • 영화 (22)
        • 책 (7)
      • 기타 (48)
  • hELLO· Designed By정상우.v4.10.3
생각 기록실
Python - 알고리즘 (하노이 탑)
상단으로

티스토리툴바