문제
https://school.programmers.co.kr/learn/courses/30/lessons/172928
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다. 산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.
- ["방향 거리", "방향 거리" … ]
예를 들어 "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다. 로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다.
- 주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
- 주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.
위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.
공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1) 입니다.

공원을 나타내는 문자열 배열 park, 로봇 강아지가 수행할 명령이 담긴 문자열 배열 routes가 매개변수로 주어질 때, 로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- 3 ≤ park의 길이 ≤ 50
- 1 ≤ routes의 길이 ≤ 50
코드
# 공원 산책
# Lv.1
def solution(park, routes):
# define map
row = len(park)
col = len(park[0])
# find start point
for i in range(row):
for j in range(col):
if park[i][j] == "S":
now_r = i
now_c = j
# move per command
ahead_i = [[0, 1], [0, -1], [1, 0], [-1, 0]]
for i in range(len(routes)):
# print("-------------------")
next_r = now_r
next_c = now_c
ahead = routes[i][0]
block = int(routes[i][2])
check = 0
if ahead == "E":
go = ahead_i[0]
elif ahead == "W":
go = ahead_i[1]
elif ahead == "S":
go = ahead_i[2]
elif ahead == "N":
go = ahead_i[3]
for j in range(block):
next_r += go[0]
next_c += go[1]
# check
# print("now: ", now_r, now_c)
# print("next: ", next_r, next_c)
if next_r < 0 or row <= next_r or next_c < 0 or col <= next_c or park[next_r][next_c] == "X":
check = 1
break
if check == 1:
continue
else:
now_r = next_r
now_c = next_c
answer = [now_r, now_c]
return answer
알고리즘
1. 행과 열의 길이를 row, col에 저장한다
2. 시작점을 찾아 현재 위치를 나타내는 변수 now_r, now_c에 저장한다
3. 각 방향(동서남북)으로 갈 때 더해야 하는 좌표 값을 ahead_i에 저장한다
4. 이동해야 하는 route가 담긴 routes만큼 아래를 반복한다
5. 해당 route에서 ahead는 갈 방향, block은 얼만큼 가야 하는지를 저장한다
6. ahead에 따라 갈 방향에 더할 좌표 값인 ahead_i를 go에 할당한다
7. block의 수만큼 아래를 반복한다
8. 다음 좌표 값이 공원 안인지, 장애물은 아니라면 반복한다
9. 만약 block만큼 목적지까지 갈 수 있다면(check = 0) 이동한다(now에 next 할당)
10. 마지막으로 도착한 좌표를 배열으로 반환한다
피드백
다음 좌표로 이동한 후에 이동한 경로에 X가 있는지 확인하는 방식으로 코드를 풀었었다. 그러나 코드가 복잡해지고 불분명해져서 변경하였다.
'Python 알고리즘 공부 > 프로그래머스 코딩테스트 연습' 카테고리의 다른 글
| 개인정보 수집 유효기간 (python) (1) | 2023.05.21 |
|---|---|
| 둘만의 암호 (python) (0) | 2023.05.18 |
| 달리기 경주 (python) (0) | 2023.05.16 |
| 광물 캐기 (python) (0) | 2023.05.13 |
| 추억 점수 (python) (0) | 2023.05.13 |
댓글