routes
를 돌며 이동 명령 수행이동방향에 맞는 좌표값의 변화를 딕셔너리에 담았다.
예를들어, E(동쪽)방향의 경우 행은 그대로(+0)있고 열은 +1
move = {"E": (0,1), "W": (0,-1), "S": (1,0), "N": (-1,0)}
공원의 모든 좌표를 돌며 "S"
인지 확인하고, "S"
이면 그 위치를 현재위치 (loc
)로 설정하고 탐색을 끝낸다.
# 1. 시작 위치 찾기
for x in range(h):
if "S" in park[x]:
loc = [x, park[x].index("S")]
break
routes
의 명령들을 순차적으로 실행한다.
제한 사항
이동했을 때의 위치가 공원 좌표 범위 안에 있어야 하고, 장애물이 없는 길로만 이동할 수 있다.
예를들어 "E 2"
명령을 처리한다고 가정하자. 이 경우 동쪽으로 2칸 이동해야한다.
동쪽으로 한 칸씩 이동하며 위의 제한사항 조건에 맞는지 확인한다.
def solution(park, routes):
h = len(park)
w = len(park[0])
loc = [] # 현재위치
move = {"E": (0,1), "W": (0,-1), "S": (1,0), "N": (-1,0)}
# 1. 시작 위치 찾기
for x in range(h):
if "S" in park[x]:
loc = [x, park[x].index("S")]
break
# 2. 이동
for route in routes:
op, n = route.split(" ")
op = move[op]
n = int(n)
tx, ty = loc[0], loc[1]
# 한칸씩 n번 이동해보기
for _ in range(n):
tx += op[0]
ty += op[1]
if not (0<= tx < h and 0<= ty < w and park[tx][ty] != "X"): break
else:
loc = [tx, ty]
return loc
# BEFORE
if not (0<= tx < h and 0<= ty < w and park[tx][ty] == "O"): break
출발지점에서 시작해 이동하다보면 다시 출발지점으로 돌아오는 경우도 있다.
위의 코드는 출발지점도 장애물로 인식하므로 아래 코드 처럼 "X"표시인 경우만 장애물로 인식하도록 바꿔주어야 한다.
# AFTER
if not (0<= tx < h and 0<= ty < w and park[tx][ty] != "X"): break