문제
지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다. 산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.
- ["방향 거리", "방향 거리" … ]
예를 들어 "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다. 로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다.
- 주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
- 주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.
위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.
공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1) 입니다.
공원을 나타내는 문자열 배열 park, 로봇 강아지가 수행할 명령이 담긴 문자열 배열 routes가 매개변수로 주어질 때, 로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- 3 ≤ park의 길이 ≤ 50
- 1 ≤ routes의 길이 ≤ 50
접근 방식
전형적인 dx, dy 문제
하지만 dx, dy 접근이 익숙하지 않아 하드코딩으로 진행함
배열의 가로 및 세로 길이를 wid, hei 변수에 할당
그리고 입력받는 park가 ['SOO', 'OOO', 'OOX'] 이런식으로 문자열들이 붙어서 나오기 때문에
answer이라는 빈 배열을 선언하고 park를 x 인자로 돌면서 list(x)로 한 문자씩 잘라서 answer 배열에 저장
그리고 'S'의 위치를 찾기 위해 answer 배열안을 탐색하면서 S를 찾으면 S의 행, 열 위치를 index_first, index_second에 할당해주고 각 값을 a, b 변수에 저장
그리고 routes가 ["E 2","S 3","W 1"] 이런식으로 문자와 숫자가 빈 칸을 띄고 나오기 때문에 해당 배열을 split으로 key, value로 나눠줌
그리고 cnt 라는 변수를 0으로 선언해줌
cnt 변수를 선언한 이유는 아래 로직에서 필요하기 때문
이제 value만큼 for문을 돌면서 key값이 E, W, S, N 일 때를 찾음
예로 'E' 가 나오면 오른쪽으로 이동하는 것이기에 b의 위치를 옮겨야 함
근데 현재 위치에서 오른쪽으로 이동하려할 때 전체 너비보다 더 큰 값이 오면 해당 명령은 취소해야 함
value(이동해야하는 칸 수)가 얼마든 일단 1개씩 이동
따라서 b + 1 이 wid보다 작거나 같고 park[a][b+1]이 'X'가 아니면 b의 위치를 오른쪽으로 한 칸 이동시킴
그리고 cnt 값도 +1을 해줌
왜냐면 예로 시작점이 0,0이고 첫 번째 명령이 [E 3]인데 배열의 [0][3]가 'X'일 경우, 방금 위의 식으로 [0][2]까지는 조건에 위배되지 않으므로 한 칸 이동해서 [0][2]이 된 상태임. 이 상태에서 한 번 더 이동해야 하는데 [a][b+1] == 'X'이므로 조건에 위배됨
따라서 이 명령은 취소되야 함. 즉, 다시 [0][0] 으로 돌아가야 함. 이 때 if문에 충족할 때 마다 cnt값을 하나씩 더해주지 않으면 명령이 취소될 때 시작점이 어딘지 찾지 못하는 문제가 발생하므로 cnt값을 누적시켜서 명령이 취소될 때 시작점으로 다시 돌아가게 해줌
이런식으로 키가 W, S, N일 때도 a, b값을 갱신해주고 return [a, b]를 통해 답 출력
코드
# # 프로그래머스 Lv1 공원 산책
def solution(park, routes):
answer = []
# 가로 및 세로 길이 구하기
wid = len(park[0]) - 1
hei = len(park) - 1
# park 안의 문자열 하나씩 자르기
for x in park:
answer.append(list(x))
for row in answer:
if 'S' in row:
index_first = row.index('S')
index_second = answer.index(row)
break
# S의 행, 열 인덱스값 구하기
a, b = index_second, index_first
for item in routes:
key, value = item.split()
value = int(value)
cnt = 0
for i in range(value):
if key == 'E':
if b + 1 <= wid and park[a][b+1] != 'X':
b += 1
cnt += 1
else:
b -= cnt
break
if key == 'W':
if b - 1 >= 0 and park[a][b-1] != 'X':
b -= 1
cnt += 1
else:
b += cnt
break
if key == 'S':
if a + 1 <= hei and park[a+1][b] != 'X':
a += 1
cnt += 1
else:
a -= cnt
break
if key == 'N':
if a -1 >= 0 and park[a-1][b] != 'X':
a -= 1
cnt += 1
else:
a += cnt
break
return [a,b]
park = ["SOO", "OXX", "OOO"]
routes = ["E 2","S 3","W 1"]
result = solution(park, routes)
print(result)