아이디어 😍
뭔가 특별한 알고리즘을 쓰진 않은 것 같다.
다만 y축(column) 받을 때 인덱스가 좀 헷갈렸다.. (column 인덱스는 위에서 아래로 갈 때 0부터 수가 증가하는데, 문제에서는 아래에서 위로 갈 때 1부터 수가 증가하는 모양으로 입력이 들어온다.)
그것만 주의하면 괜찮을 것 같다 !
코드 😆
import collections
direction_move_index = {'W': (0, -1), 'S': (1, 0), 'E': (0, 1), 'N': (-1, 0)}
r_direction = ['N', 'E', 'S', 'W'] # 오른쪽으로
l_direction = ['N', 'W', 'S', 'E'] # 왼쪽으로
def crash_wall(i, j):
"""
범위 밖으로 가는지 체크
:return:
"""
if 0 <= i < B and 0 <= j < A:
return True # 범위 내
return False # 범위 벗어님
def crash_robot(robot_name: int):
"""
다른 로봇과 부딪치는지 체크
:param i:
:param j:
:return:
"""
for k in range(1, N + 1): # 로봇들 쯕 보면서
if k != robot_name: # 그 로봇이 아닌데
if robots[robot_name][0] == robots[k][0] and robots[robot_name][1] == robots[k][1]: # 위치가 같으면
return k
return False
def turn_L(robot_name: int, cnt: int):
"""
왼쪽으로 90도 회전
:param i:
:param j:
:return:
"""
d = robots[robot_name][2] # 로봇의 현재 방향
cnt = cnt % 4
if d == 'N':
cnt = cnt % 4
elif d == 'E':
cnt = (cnt + 3) % 4
elif d == 'S':
cnt = (cnt + 2) % 4
elif d == 'W':
cnt = (cnt + 1) % 4
return l_direction[cnt]
def turn_R(robot_name: int, cnt: int):
"""
왼쪽으로 90도 회전
:param i:
:param j:
:return:
"""
d = robots[robot_name][2] # 로봇의 현재 방향
cnt = cnt % 4
if d == 'N':
cnt = cnt % 4
elif d == 'E':
cnt = (cnt + 1) % 4
elif d == 'S':
cnt = (cnt + 2) % 4
elif d == 'W':
cnt = (cnt + 3) % 4
return r_direction[cnt]
# def forward_go(robot_name: int, cnt: int):
# """
# 로봇을 지금 바라보고 있는 방향으로 cnt만큼 움직이게 하기
# :param robot_name:
# :param dire:
# :param cnt:
# :return:
# """
# i, j = robots[robot_name][:2] # 로봇 원래 위치
# dire = robots[robot_name][2] # 로봇 원래 방향
#
# ni = i + direction_move_index[dire][0] * cnt
# nj = j + direction_move_index[dire][1] * cnt
#
# robots[robot_name][0] = ni
# robots[robot_name][1] = nj
# return ni, nj
A, B = map(int, input().split())
N, M = map(int, input().split())
robots = collections.defaultdict(tuple)
for i in range(1, N + 1): # 로봇 초기 위치, 방향 입력 받기
x, y, d = input().split()
robots[i] = [B - int(y), int(x) - 1, d] # y, x좌표, 방향을 입력받음
# print(robots)
def sol():
for _ in range(M): # 명령
robot_name, command, command_cnt = input().split()
robot_name = int(robot_name)
command_cnt = int(command_cnt)
i, j = robots[robot_name][:2] # 로봇의 명령 수행 이전 위치
if command == 'L':
d = turn_L(robot_name, command_cnt)
robots[robot_name][2] = d
elif command == 'R':
d = turn_R(robot_name, command_cnt)
robots[robot_name][2] = d
elif command == 'F':
i, j = robots[robot_name][:2] # 로봇 원래 위치
dire = robots[robot_name][2] # 로봇 원래 방향
for k in range(command_cnt):
i = i + direction_move_index[dire][0]
j = j + direction_move_index[dire][1]
robots[robot_name][0] = i
robots[robot_name][1] = j
tmp = crash_robot(robot_name) # 혹시 다른 로봇과 충돌했는지
if tmp:
print('Robot {} crashes into robot {}'.format(robot_name, tmp))
return
if crash_wall(i, j) == False: # 혹시 범위 넘었는지
print('Robot {} crashes into the wall'.format(robot_name))
return
# print(robots)
else: # 괜찮으면
print('OK')
sol()
그리고 원래 이 문제가 있는 사이트인 NCPC 2005에 가서 input, output을 받아서 하나씩 돌려보면서 수정했다 !
728x90
'즐거운 PS 👩💻🥰' 카테고리의 다른 글
[백준-파이썬] 11067: 모노톤길 (0) | 2021.10.08 |
---|---|
[백준-파이썬] 14267: 회사 문화1 (0) | 2021.10.08 |
[백준-파이썬] 2206: 벽 부수고 이동하기 (0) | 2021.10.08 |
[백준-파이썬] 1991: 트리 순회 (0) | 2021.10.07 |
[백준-파이썬] 1753: 최단 경로 (0) | 2021.10.07 |