반응형
https://school.programmers.co.kr/learn/courses/30/lessons/12946
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제풀이
작은 순서부터 우선 이동할 수 있게끔 해야 하므로 재귀적인 방법으로 풀이가 가능하다.
- 원판은 항상 크기가 큰 순서부터 쌓아야 한다. 각 원판은 중간 기둥을 지나서 목표 위치에 도달해야 한다. 또한 n이 홀수라면 첫 이동시 1의 크기의 원판은 끝 기둥으로 이동해야 하며 짝수라면 중간 기둥으로 이동해야 한다.
- 재귀의 최대 깊이 즉 원소의 값이 가장 작은 값을 우선적으로 계산하기 위해 3개의 기둥 중 시작위치, 목표위치, 경유위치의 값을 바꿔 주면서 깊이 탐색을 해준다.
| 은 각 수행 단계의 경계선, 굵음 표시는 시작위치, 굵음 표시는 목표위치, 0은 빈 공간, 0 이상의 숫자들은 원판의 크기라고 가정하자 n이 3일 때를 기준으로 시뮬레이션을 해본다면
1 0 0 | 0 0 0 | 0 0 0 | 0 0 0 | 0 0 0 | 0 0 0 | 0 0 0 | 0 0 1
2 0 0 | 2 0 0 | 0 0 0 | 0 1 0 | 0 1 0 | 0 0 0 | 0 0 2 | 0 0 2
3 0 0 | 3 0 1 | 3 2 1 | 3 2 0 | 0 2 3 | 1 2 3 | 1 0 3 | 0 0 3
위와 같이 7번의 과정을 수행하는 게 최적의 해가 될 것이다. 위의 과정을 재귀로 표현하면 아래와 같다.
def solution(n):
answer = []
def recursion(n, start, to, mid):
if n == 1:
return answer.append([start, to])
else:
recursion(n - 1, start, mid, to)
answer.append([start, to])
recursion(n - 1, mid, to, start)
return answer
return recursion(n, 1, 3, 2)
'프로그래머스 > lv.2' 카테고리의 다른 글
가장 큰 정사각형 찾기 (1) | 2024.03.24 |
---|---|
리코쳇 로봇 (0) | 2024.03.22 |
의상 (0) | 2024.03.20 |
쿼드압축 후 개수 세기 (0) | 2024.03.20 |
거리두기 확인하기 (3) | 2024.03.19 |