이번 문제는 주어진 명령 순서대로 각 로봇들을 움직이도록 하는 문제였다. 명령들을 모두 처리하는 동안 범위를 벗어나거나 로봇들 간의 위치가 겹치지 않을 경우에는 OK를 출력하고, 그렇지 않다면 해당하는 문장을 출력해야 한다. 이를 위해 함수로 범위를 벗어나는 경우와 부딪히는 경우를 따로 구현하였고, 로봇의 방향이 알파벳으로 주어지므로, 매핑 딕셔너리를 만들어 바로바로 바꿔서 넣어주었다. 방향 지정은 이 문제의 경우 y좌표가 클수록 아래로 가는 것이 아닌 위로 가므로 북쪽과 남쪽을 다른 문제들과 반대로 설정하였다.
a, b=map(int, input().split())
n, m=map(int, input().split())
robots=[]
dy, dx=[0, -1, 0, 1], [1, 0, -1, 0]
mapping={'E': 0, 'S': 1, 'W': 2, 'N': 3}
grid=[[0 for _ in range(a)] for _ in range(b)]
for i in range(n):
c, r, d=map(str, input().split())
d=mapping[d]
robots.append([int(r)-1, int(c)-1, d])
grid[int(r)-1][int(c)-1]=i+1
commands=[]
for i in range(m):
num, com, s=map(str, input().split())
commands.append((int(num), com, int(s)))
def chk_range(y, x):
if 0<=y<b and 0<=x<a:
return True
return False
def chk_crash(y, x):
if grid[y][x]>0:
return True
return False
def move_robots():
for rb, cm, sz in commands:
if cm=='F':
for i in range(1, sz+1):
grid[robots[rb-1][0]][robots[rb-1][1]]=0
robots[rb-1][0], robots[rb-1][1]=robots[rb-1][0]+dy[robots[rb-1][2]], robots[rb-1][1]+dx[robots[rb-1][2]]
if not chk_range(robots[rb-1][0], robots[rb-1][1]):
print("Robot {0} crashes into the wall".format(rb))
quit()
if chk_crash(robots[rb-1][0], robots[rb-1][1]):
print("Robot {0} crashes into robot {1}".format(rb, grid[robots[rb-1][0]][robots[rb-1][1]]))
quit()
grid[robots[rb - 1][0]][robots[rb - 1][1]] = rb
elif cm=='L':
for _ in range(sz):
robots[rb-1][2]=(robots[rb-1][2]+3)%4
elif cm=='R':
for _ in range(sz):
robots[rb-1][2]=(robots[rb-1][2]+1)%4
print("OK")
move_robots()