문제
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다.
산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.
["방향 거리", "방향 거리" … ]
예를 들어 "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다.
로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다.
주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.
주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.
위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.
공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0),
우측 하단의 좌표는 (H - 1, W - 1) 입니다.
코드 및 해설
파이썬 알고리즘 같은 경우는 나도 해설을 보면서 이해하면서 코드를 짰기 때문에 풀이를 사실 할 수가 없다.
한줄씩 풀어서 설명 해 보겠다.
h = len(park)
w = len(park[0])
우선 전체 공원의 높이와 너비를 h,w로 설정한다.
이때 park의 갯수는 높이이며, park[0] 즉 한개의 park값안에 들어있는 데이터의 수를 너비로 설정한다.
x, y = next((i, j) for i, row in enumerate(park) for j, char in enumerate(row) if char == 'S')
x와 y의 값을 각각 i 와 j로 하는데,
i는 park의 행을 확인하고, j는 모든 열을 확인하는데 이때
S를 찾을때의 그 좌표값을 i와 j 에 할당한다. 즉 x, y는 시작지점의 좌표가 된다.
directions = {'N': (-1, 0), 'S': (1, 0), 'W': (0, -1), 'E': (0, 1)}
방향의 기본적인 진행을 설정한다. 키가 위치 값은 그 키에 맞는 진행이다.
N은 즉 North 북쪽이기 때문에 x의 값을 -1함으로써 설명할 수 있다. 다들 이런 식이다.
for route in routes:
d,n = route.split()
dx,dy = directions[d]
nx,ny = x,y
routes에서 route 를 꺼내 올때마다 반복을 시킨다.
d와 n 을 각각 방향과 거리로 나눈다.
이때 위의 설정된 방향에 맞는 딕셔너리의 키와 값을 불러온다.
즉 dx, dy는 현재 방향에 대한 좌표값인 것이다.
nx, ny를 현재 위치로 초기화를 시킨다.
for _ in range(int(n)):
nx += dx
ny += dy
if not (0 <= nx <h and 0 <= ny < w) or park[nx][ny] == 'X':
break
else:
x,y = nx, ny
n의 값에 따라서 그만큼 반복을 한다.
초기화된 nx와 ny에 dx와 dy를 더한다. 즉 현재 위치에서 해당 방향만큼 1 이동한 것이다.
이때, nx와 ny의 값이 공원을 넘지 않았는지 또는 park [nx] [ny] 를 사용해서 현재 위치에 X 즉 장애물 의 유무또한 확인하여 반복을 종료한다.
반복이 종료되지않고 끝난다면, nx 와 ny를 현재의 위치로 설정한다.
현재 좌표를 반환하고 끝을 낸다.
아래는 완성된 코드이다.
def solution(park, routes):
h = len(park)
w = len(park[0])
x, y = next((i, j) for i, row in enumerate(park) for j, char in enumerate(row) if char == 'S')
directions = {'N': (-1, 0), 'S': (1, 0), 'W': (0, -1), 'E': (0, 1)}
for route in routes:
d,n = route.split()
dx,dy = directions[d]
nx,ny = x,y
for _ in range(int(n)):
nx += dx
ny += dy
if not (0 <= nx <h and 0 <= ny < w) or park[nx][ny] == 'X':
break
else:
x,y = nx, ny
return [x,y]
링크
Programmers/프로그래머스/1/172928. 공원 산책 at main · K-MarkLee/Programmers
Programmers/프로그래머스/1/172928. 공원 산책 at main · K-MarkLee/Programmers
This is an auto push repository for Baekjoon Online Judge created with [BaekjoonHub](https://github.com/BaekjoonHub/BaekjoonHub). - K-MarkLee/Programmers
github.com
'Daily 코드카타 > Python 알고리즘' 카테고리의 다른 글
코딩테스트 Python 알고리즘 (N개의 최소공배수) (2) | 2024.11.14 |
---|---|
코딩테스트 Python 알고리즘 (예상 대진표) (0) | 2024.11.13 |
코딩테스트 Python 알고리즘 (카펫) (0) | 2024.11.12 |
코딩테스트 Python 알고리즘 (피보나치 수) (0) | 2024.11.11 |
코딩테스트 Python 알고리즘 (1) | 2024.11.05 |