Algorithm

[프로그래머스 / 파이썬] 미로 탈출 명령어

임쁘엔 2023. 7. 13. 22:37
 

프로그래머스

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

programmers.co.kr

정답 코드

def solution(n, m, x, y, r, c, k):
    answer = ''
    dist = abs(x - r) + abs(y - c)
    k -= dist

    if k < 0 or k % 2 != 0:
        return "impossible"

    direction = {'d': 0, 'l': 0, 'r': 0, 'u': 0}

    if x > r:
        direction['u'] += x - r
    else:
        direction['d'] += r - x

    if y > c:
        direction['l'] += y - c
    else:
        direction['r'] += c - y

    answer += 'd' * direction['d']

    d = min(k // 2, n - (x + direction['d']))
    answer += 'd' * d
    direction['u'] += d
    k -= 2 * d

    answer += 'l' * direction['l']
    l = min(k // 2, y - direction['l'] - 1)
    answer += 'l' * l
    direction['r'] += l
    k -= 2 * l

    answer += 'rl' * (k // 2)
    answer += 'r' * direction['r']
    answer += 'u' * direction['u']

    return answer

문제 풀이

함수는 n과 m으로 미로의 크기를, x와 y로 현재 위치를, r과 c로 출구의 위치를, 그리고 k로 사용 가능한 명령어 개수를 입력으로 받습니다.


먼저, 현재 위치 (x, y)와 출구의 위치 (r, c) 사이의 거리인 dist를 계산합니다. 그리고 k에서 dist를 뺀 값으로 k를 업데이트합니다. 이렇게 함으로써 출구까지 가는 데 필요한 명령어 사용 횟수를 계산할 수 있습니다.


그 후, 명령어 사용이 불가능한 경우를 처리하기 위해 k가 음수이거나 홀수인 경우 "impossible"을 반환합니다.


그 다음, 이동 방향을 나타내는 딕셔너리 direction을 초기화합니다. 각 방향('d', 'l', 'r', 'u')에 대한 이동 횟수를 저장하기 위한 키-값 쌍으로 구성됩니다.


현재 위치 (x, y)와 출구의 위치 (r, c)를 비교하여 이동 방향을 결정합니다. 만약 x가 r보다 크다면, 위로 이동해야 하므로 direction['u']에 x - r을 더합니다. 그렇지 않으면 아래로 이동해야 하므로 direction['d']에 r - x를 더합니다. 비슷하게, y가 c보다 크다면 왼쪽으로 이동해야 하므로 direction['l']에 y - c를 더하고, 그렇지 않으면 오른쪽으로 이동해야 하므로 direction['r']에 c - y를 더합니다.


이동 방향에 따라 문자열 answer에 이동 명령어를 추가합니다. 먼저, 아래로 이동하는 명령어 'd'를 direction['d']번 추가합니다. 그리고 추가된 이동 횟수 d를 계산하여 k와 direction['u']를 업데이트합니다.


다음으로, 왼쪽으로 이동하는 명령어 'l'을 direction['l']번 추가합니다. 추가된 이동 횟수 l을 계산하여 k와 direction['r']를 업데이트합니다.


이제 남은 k를 2로 나눈 몫만큼 'rl'을 추가하고, 오른쪽으로 이동하는 명령어 'r'을 direction['r']번 추가합니다. 그리고 위로 이동하는 명령어 'u'를 direction['u']번 추가합니다.


최종적으로 계산된 answer를 반환하여 문제를 해결합니다.