728x90
반응형
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) 입니다.
"""
def solution(park, routes):
dog, width, height, block = {'y': 0, 'x': 0}, len(park[0]), len(park), []
for y in range(len(park)):
for x in range(len(park[0])):
if park[y][x] == 'X': block.append([y, x])
elif park[y][x] == 'S': dog = {'y': y, 'x': x}
for route in routes:
op, n = route.split()
n = int(n)
move = {'E': {'y': 0, 'x': n}, 'S': {'y': n, 'x': 0},'W': {'y': 0, 'x': -n}, 'N': {'y': -n, 'x': 0}}
if 0 <= (dog['y'] + move[op]['y']) < height and 0 <= (dog['x'] + move[op]['x']) < width:
check_block = True
for y, x in block:
if min(dog['y'], dog['y'] + move[op]['y']) <= y <= max(dog['y'], dog['y'] + move[op]['y']):
if min(dog['x'], dog['x'] + move[op]['x']) <= x <= max(dog['x'], dog['x'] + move[op]['x']):
check_block = False
break
if check_block:
dog['y'] += move[op]['y']
dog['x'] += move[op]['x']
return [dog['y'],dog['x']]
"""
코드 리뷰
def solution(park, routes):
dog, width, height, block = {'y': 0, 'x': 0}, len(park[0]), len(park), []
# 개의 좌표를 담을 딕셔너리 dog, 공원의 가로, 세로, block의 위치를 담을 리스트를 선언
for y in range(len(park)): # 공원을 이중for문으로 돌면서
for x in range(len(park[0])):
if park[y][x] == 'X': block.append([y, x])
# 장애물이 있다면 block리스트에 추가
elif park[y][x] == 'S': dog = {'y': y, 'x': x}
# 개의 현재위치를 찾았다면 dog의 좌표를 변경
for route in routes: 루트들을 돌면서
op, n = route.split() # 동서남북 위치를 담을 op, 얼마나 이동할지 n
n = int(n)
move = {'E': {'y': 0, 'x': n}, 'S': {'y': n, 'x': 0},'W': {'y': 0, 'x': -n}, 'N': {'y': -n, 'x': 0}}
# 좌표를 저장함.
if 0 <= (dog['y'] + move[op]['y']) < height and 0 <= (dog['x'] + move[op]['x']) < width:
# 개의 현재 위치에서 이동했을때 공원의 좌표를 벗어나지 않는지 검사함.
check_block = True
# 이동할 경로에 블록이 있는지 검사하기 위한 변수
for y, x in block: # 처음에 장애물들의 좌표를 담은 리스트들을 돌면서
# min max 함수를 사용한 이유는 마이너스 좌표로 이동할수 있고,
# 플러스 좌표로 이동할수있기 때문에 min, max문으로 다양한 경우를 하나로 합쳤음.
if min(dog['y'], dog['y'] + move[op]['y']) <= y <= max(dog['y'], dog['y'] + move[op]['y']):
if min(dog['x'], dog['x'] + move[op]['x']) <= x <= max(dog['x'], dog['x'] + move[op]['x']):
# 현재 개의 위치와 이동할 위치 사이에 장애물이 있다면
# 이동하지 못하므로 check_block 변수를 false로 변경하고 종료
check_block = False
break
if check_block: # 이동할 경로에 장애물이 없다면 개의 위치를 이동시킴
dog['y'] += move[op]['y']
dog['x'] += move[op]['x']
return [dog['y'],dog['x']]
"""728x90
반응형
'개발 > 문제풀이' 카테고리의 다른 글
| 프로그래머스 '월간 코드 챌린지 시즌2 괄호 회전하기' 파이썬 풀이 (0) | 2023.05.08 |
|---|---|
| 프로그래머스 '혼자서 하는 틱택토' 파이썬 풀이 (0) | 2023.04.26 |
| 프로그래머스 '코드 처리하기' 파이썬 풀이 (0) | 2023.04.24 |
| 프로그래머스 '추억 점수' 파이썬 풀이 (0) | 2023.04.05 |
| 프로그래머스 '카드 뭉치' 파이썬 풀이 (0) | 2023.03.15 |
댓글