문제 설명
하노이 탑(Tower of Hanoi)은 퍼즐의 일종입니다. 세 개의 기둥과 이 기동에 꽂을 수 있는 크기가 다양한 원판들이 있고, 퍼즐을 시작하기 전에는 한 기둥에 원판들이 작은 것이 위에 있도록 순서대로 쌓여 있습니다. 게임의 목적은 다음 두 가지 조건을 만족시키면서, 한 기둥에 꽂힌 원판들을 그 순서 그대로 다른 기둥으로 옮겨서 다시 쌓는 것입니다. 한 번에 하나의 원판만 옮길 수 있습니다. 큰 원판이 작은 원판 위에 있어서는 안됩니다. 하노이 탑의 세 개의 기둥을 왼쪽 부터 1번, 2번, 3번이라고 하겠습니다. 1번에는 n개의 원판이 있고 이 n개의 원판을 3번 원판으로 최소 횟수로 옮기려고 합니다. 1번 기둥에 있는 원판의 개수 n이 매개변수로 주어질 때, n개의 원판을 3번 원판으로 최소로 옮기는 방법을 return하는 solution를 완성해주세요.
풀이
하노이 탑 문제는 학생 때 봐둔 적이 있어서 기억나는 대로 끄적여서 일단 기록해봤다.
def hanoi(n,start,end,via):
if n == 1:
print(start,' -> ',end)
return
move(n-1,start,via,end)
print(start,' -> ',end)
move(n-1,via,end,start)
4층짜리 탑이 있다고 생각했을 때, 알고리즘을 고려해보자.
1.start의 블럭 1,2,3를 end를 경유하여 via로 옮긴다. -> 재귀
2. start의 맨 아래의 블럭 4를 end로 옮긴다.
3. via의 블럭 1,2,3을 start를 경유하여 end로 옮긴다. -> 재귀
종료.
<재귀> via가 목표지점이므로 via가 end로 바뀌고, end가 via로 바뀐다. 1-1과 3-1은 거의 동일
1-1. 블럭 1,2를 via로 옮긴다.
1-2 블럭 3을 end로 옮긴다.
1-3 블럭 1,2를 end로 옮긴다.
<재귀>
1-1-1. 블럭 1을 via로 옮긴다.
1-1-2. 블럭 2를 end로 옮긴다.
1-1-3 블럭 1을 end로 옮긴다.
<재귀>
1-1-1-1 블럭 1을 end로 옮긴다.
이것을 이용해서 문제가 원하는 코드를 출력해보자.
def move(n, start, end, via):
if n==1:
answer.append([start,end])
return
move(n-1,start,via,end)
answer.append([start,end])
move(n-1,via,end,start)
def solution(n):
global answer
answer = []
move(n,1,3,2)
return answer
출처
https://school.programmers.co.kr/learn/courses/30/lessons/12946
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
728x90
'Programing > 프로그래머스 오답노트' 카테고리의 다른 글
[프로그래머스] 게임 맵 최단경로 - ( BFS ) (0) | 2023.10.05 |
---|---|
[프로그래머스] 정수 삼각형 - ( 모든 경로 합 구해보기 ) (0) | 2023.10.01 |
[프로그래머스] 주차 요금 계산 - ( dict ) (0) | 2023.09.30 |
[프로그래머스] n진수 게임 (0) | 2023.09.30 |
[프로그래머스] [3차]압축 - ( 문자열 슬라이싱으로 dict.keys 조사 ) (0) | 2023.09.29 |
댓글