문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/172928
오랜만에 프로그래머스에 들어가봤는데, 문제가 많이 추가되어서 쉬운 문제 위주로 몇개 풀어보았습니다.
이번 문제는 단순 구현에 가까운 문제 입니다.
2차원 배열에 시작점을 주고 방향, 거리 커맨드가 주어집니다. 이때, 이동시 장애물이 있다면, 해당 커맨드는 취소되고 원래 자리로 돌아옵니다. 마지막에는 최종 위치의 좌표값을 반환해 주면 되겠습니다.
보통 2차원 배열에서 길찾기 문제는 DFS & BFS 내지 백트랙킹으로 풀곤 했었는데, 조건이 그렇게 까다롭지 않아서 단순 구현으로 접근해 보았습니다. 로직은 생각보다 간단합니다. 해당 커맨드중 배열 밖으로 벗어나간다거나 장애물이 있다면 해당 커맨드는 포기하고, 문제가 없다면 이동하는 것으로 짜보았습니다.
def solution(park, routes):
h = len(park)
w = len(park[0])
x,y = 0,0
nav = {
'S': [1,0],
'N':[-1,0],
'W': [0,-1],
'E':[0,1]
}
for i in range(h):
for j in range(w):
if park[i][j] == "S":
x = i
y = j
for route in routes:
direction, distance = route.split()
distance = int(distance)
flag = 0
step_x = x
step_y = y
for i in range(1,distance+1):
step_x += nav[direction][0]
step_y += nav[direction][1]
if step_x >= h or step_x <= -1 or step_y >= w or step_y <= -1 or park[step_x][step_y] == 'X':
flag = 1
break
if(flag == 0):
x += nav[direction][0] * distance
y += nav[direction][1] * distance
answer = [x,y]
return answer
전체 코드입니다. 하나씩 살펴보겠습니다.
for i in range(h):
for j in range(w):
if park[i][j] == "S":
x = i
y = j
배열 전체에서 시작점을 파악하여 저장합니다.
for route in routes:
direction, distance = route.split()
distance = int(distance)
flag = 0
step_x = x
step_y = y
for i in range(1,distance+1):
step_x += nav[direction][0]
step_y += nav[direction][1]
if step_x >= h or step_x <= -1 or step_y >= w or step_y <= -1 or park[step_x][step_y] == 'X':
flag = 1
break
거리와 방향을 따로 저장한 다음, 해당 방향으로 한 스텝씩 옮기면서 문제가 있는지 확인합니다. 문제가 있다면 flag를 활성화 합니다.
if(flag == 0):
x += nav[direction][0] * distance
y += nav[direction][1] * distance
마지막으로 flag가 활성화 되지 않았다면, 이동해 줍니다.
은근히 랜덤하게 문제를 풀다보면 막히는 파트가 단순 구현인것 같습니다. 이런 문제 특성상 고려해야할 포인트가 많고, 하나를 놓치면 끝까지 못찾는 경우가 더러 있더라구요. 결국 많이 연습해 보고, 간결하게 푼 코드를 보면서 배워나가야 할것 같습니다!