728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/150365
풀이
백트래킹을 사용했습니다.
파이썬의 기본 재귀 깊이 제한은 1000으로 매우 얕은 편으로 런타임 에러가 발생할 수 있으므로 재귀 깊이 제한을 설정해주었습니다.
lrud를 사전 순으로 {인덱스 : 문자열} 해싱하였습니다.
- 최소 이동 거리가 k보다 큰 경우
- (k - 최소 이동 거리)가 홀수인 경우
위 두 가지 경우를 제외하고 백트래킹을 진행합니다.
한 칸씩 이동하며 스택에 이동 경로를 저장합니다.
앞서 이미 도착했거나 (현재 이동 거리 + 남은 최소 이동 거리)가 k보다 크다면 전 단계로 이동합니다.
현재 이동 거리가 k와 같고 탈출 지점에 도착했다면 answer에 stack을 join 한 결과를 저장하고 flag를 True로 변경해 더 이상 이동하지 않도록 해줍니다.
코드
파이썬
import sys
sys.setrecursionlimit(10 ** 6)
def solution(n, m, x, y, r, c, k):
lrud = {0: 'd', 1: 'l', 2: 'r', 3: 'u'}
dx = [1, 0, 0, -1]
dy = [0, -1, 1, 0]
answer = 'impossible'
flag = False
stack = []
def DFS(X, Y, L):
nonlocal answer, flag
if flag or k < L + abs(X - r) + abs(Y - c):
return
if L == k and (X, Y) == (r, c):
answer = ''.join(stack)
flag = True
else:
for i in range(4):
nX = X + dx[i]
nY = Y + dy[i]
if 1 <= nX <= n and 1 <= nY <= m:
stack.append(lrud[i])
DFS(nX, nY, L+1)
stack.pop()
dist = abs(x - r) + abs(y - c)
if dist <= k and (k - dist) % 2 == 0:
DFS(x, y, 0)
return answer
728x90
'🚩 코딩테스트 > 알고리즘' 카테고리의 다른 글
[백준] 13023번: ABCDE (0) | 2023.02.16 |
---|---|
[백준] 15591번: MooTube (Silver) (0) | 2023.02.14 |
[프로그래머스] 큰 수 만들기 (0) | 2023.01.21 |
[백준] 2630번: 색종이 만들기 (0) | 2022.11.05 |
[백준] 12100번: 2048 (Easy) (1) | 2022.10.07 |