🚩 코딩테스트/알고리즘

[프로그래머스] 미로 탈출 명령어

딩딩크롱 2023. 2. 2. 01:42
728x90

문제

https://school.programmers.co.kr/learn/courses/30/lessons/150365

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

백트래킹을 사용했습니다.

파이썬의 기본 재귀 깊이 제한은 1000으로 매우 얕은 편으로 런타임 에러가 발생할 수 있으므로 재귀 깊이 제한을 설정해주었습니다.

lrud를 사전 순으로 {인덱스 : 문자열} 해싱하였습니다.

  1. 최소 이동 거리가 k보다 큰 경우
  2. (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