dx, dy 테크닉을 이해하고 있으면,
그리 어렵지 않게 해결할 수 있는 문제였다.
# a, b 입력
a, b = map(int, input().split())
# n, m 입력
n, m = map(int, input().split())
# 로봇들의 정보를 담아 줄 리스트
robot_data = [0]
# mapper
mapper = {
'N': 0,
'E': 1,
'S': 2,
'W': 3,
}
# 리스트에 로봇들 정보 담아주기
for _ in range(n):
x, y, dir = input().split()
x, y = int(x), int(y)
robot_data.append([x, y, mapper[dir]])
# 함수들
# turn_left(robot_num, times)
def turn_left(robot_num, times):
# 전역 변수 선언
global robot_data
# 반복횟수만큼
for _ in range(times):
# 방향을 왼쪽으로 돌려주기
robot_data[robot_num][2] = (robot_data[robot_num][2] - 1 + 4) % 4
# turn_right(robot_num, times)
def turn_right(robot_num, times):
# 전역 변수 선언
global robot_data
# 반복횟수만큼
for _ in range(times):
# 방향을 오른쪽으로 돌려주기
robot_data[robot_num][2] = (robot_data[robot_num][2] + 1) % 4
# go_foward(robot_num)
def go_foward(robot_num):
# 전역 변수 선언
global robot_data
# 현재 로봇의 방향
curr_dir = robot_data[robot_num][2]
# dxs, dys -> 북 동 남 서 순서
dxs, dys = [0, 1, 0, -1], [1, 0, -1, 0]
# x 좌표 교체
robot_data[robot_num][0] = robot_data[robot_num][0] + dxs[curr_dir]
# y 좌표 교체
robot_data[robot_num][1] = robot_data[robot_num][1] + dys[curr_dir]
# crashed(robot_num)
def crashed(robot_num):
# 로보트들 중
for i in range(1, len(robot_data)):
# 현재 로보트가 아니면서, 좌표가 겹치는 로보트가 있으면,
if i != robot_num and robot_data[robot_num][0] == robot_data[i][0] and robot_data[robot_num][1] == robot_data[i][1]:
# 그 로보트의 번호를 반환
return i
# 없다면, 실패
return False
# in_range(robot_num)
def in_range(robot_num):
return 0 < robot_data[robot_num][0] <= a and 0 < robot_data[robot_num][1] <= b
# 결과들을 저장할 리스트
results = []
for i in range(m):
# 명령을 내릴 로봇의 숫자, 명령의 종류, 반복 횟수
robot_num, order, times = input().split()
robot_num, times = int(robot_num), int(times)
# 명령이 L인 경우
if order == 'L':
# 로봇을 좌로 90도 회전시켜주기
turn_left(robot_num, times)
# 명령이 R인 경우
elif order == 'R':
# 로봇을 우로 90도 회전시켜주기
turn_right(robot_num, times)
# 명령이 F인 경우
else:
# 반복 횟수 만큼
for _ in range(times):
# 전진
go_foward(robot_num)
# 충돌했으면,
if crashed(robot_num):
# 충돌기록
results.append('Robot %d crashes into robot %d'%(robot_num, crashed(robot_num)))
# 밖으로 벗어났으면
if not in_range(robot_num):
# 벗어남을 기록
results.append('Robot %d crashes into the wall'%(robot_num))
# 아무일도 안일어났으면,
if not results:
print('OK')
# 일어났으면
else:
# 가장 먼저 일어난 사건을 출력
print(results[0])
'Algorithm(BOJ, Python) > Simulation' 카테고리의 다른 글
[백준_15662] 톱니바퀴2 python (0) | 2022.09.18 |
---|---|
[백준_14891] 톱니바퀴 python (0) | 2022.09.17 |
[백준_14499] 주사위굴리기 python (0) | 2022.09.04 |
[백준_14503] 로봇청소기 python (0) | 2022.08.28 |
[백준_5215] 지구온난화 python (0) | 2022.08.09 |