문제 설명 지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다. 산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.
["방향 거리", "방향 거리" … ] 예를 들어 "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다. 로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다.
주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다. 주어진 방향으로 이동 중 장애물을 만나는지 확인합니다. 위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다. 공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1) 입니다.
공원을 나타내는 문자열 배열 park, 로봇 강아지가 수행할 명령이 담긴 문자열 배열 routes가 매개변수로 주어질 때, 로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항 3 ≤ park의 길이 ≤ 50 3 ≤ park[i]의 길이 ≤ 50 park[i]는 다음 문자들로 이루어져 있으며 시작지점은 하나만 주어집니다. S : 시작 지점 O : 이동 가능한 통로 X : 장애물 park는 직사각형 모양입니다.
1 ≤ routes의 길이 ≤ 50 routes의 각 원소는 로봇 강아지가 수행할 명령어를 나타냅니다. 로봇 강아지는 routes의 첫 번째 원소부터 순서대로 명령을 수행합니다. routes의 원소는 "op n"과 같은 구조로 이루어져 있으며, op는 이동할 방향, n은 이동할 칸의 수를 의미합니다. op는 다음 네 가지중 하나로 이루어져 있습니다. N : 북쪽으로 주어진 칸만큼 이동합니다. S : 남쪽으로 주어진 칸만큼 이동합니다. W : 서쪽으로 주어진 칸만큼 이동합니다. E : 동쪽으로 주어진 칸만큼 이동합니다. 1 ≤ n ≤ 9
장애물을 만나거나 공원을 벗어나면 그 명령은 무시 명령이 수행됐으면 명령을 반영해 현재 위치를 업데이트
# 시작점을 변수 s에 장애물을 집합 x에 저장
def s_x(park):
x = set()
for i, row in enumerate(park):
for j, col in enumerate(row):
if col == "S":
s = [i,j]
if col == "X":
x.add((i,j))
return s, x
# 명령에 따라 움직이고, 장애물을 만나거나 공원을 벗어나면 그 명령은 무시
def move(routes, s, x, W, H):
# 방향을 key, 이동 좌표를 value로 저장한 딕셔너리
d = {"N":(-1,0), "S":(1,0), "W":(0,-1), "E":(0,1)}
for m in routes:
k, n = m.split() # 방향과 거리
n = int(n)
temp = s.copy() # 얕은 복사를 통해 temp를 수정할 때 s가 영향 받지 않도록 함
# 방향을 따라 한 칸씩 거리만큼 이동
for _ in range(1,n+1):
temp[0] += d[k][0]
temp[1] += d[k][1]
# 장애물을 만나거나 공원을 벗어나면 그 명령은 무시
# 집합은 불변하는 원소만 취급해서 tuple로 변형했습니다.
if tuple(temp) in x or min(temp) < 0 or H <= temp[0] or W <= temp[1]:
temp = []
break
# 명령이 수행됐으면 반영하고 아니면 기각
if temp:
s = temp
return s
def solution(park, routes):
s, x = s_x(park) # 시작점, 장애물 좌표 정보
W, H = len(park[0]), len(park) # 공원을 넘어가는 좌표
s = move(routes, s, x, W, H) # 도착 지점
return s