2174 로봇 시뮬레이션

정민용·2023년 5월 14일
0

백준

목록 보기
206/286

문제

가로 A(1≤A≤100), 세로 B(1≤B≤100) 크기의 땅이 있다. 이 땅 위에 로봇들이 N(1≤N≤100)개 있다.

로봇들의 초기 위치는 x좌표와 y좌표로 나타난다. 위의 그림에서 보듯 x좌표는 왼쪽부터, y좌표는 아래쪽부터 순서가 매겨진다. 또한 각 로봇은 맨 처음에 NWES 중 하나의 방향을 향해 서 있다. 초기에 서 있는 로봇들의 위치는 서로 다르다.

이러한 로봇들에 M(1≤M≤100)개의 명령을 내리려고 한다. 각각의 명령은 순차적으로 실행된다. 즉, 하나의 명령을 한 로봇에서 내렸으면, 그 명령이 완수될 때까지 그 로봇과 다른 모든 로봇에게 다른 명령을 내릴 수 없다. 각각의 로봇에 대해 수행하는 명령은 다음의 세 가지가 있다.

  1. L: 로봇이 향하고 있는 방향을 기준으로 왼쪽으로 90도 회전한다.
  2. R: 로봇이 향하고 있는 방향을 기준으로 오른쪽으로 90도 회전한다.
  3. F: 로봇이 향하고 있는 방향을 기준으로 앞으로 한 칸 움직인다.

간혹 로봇들에게 내리는 명령이 잘못될 수도 있기 때문에, 당신은 로봇들에게 명령을 내리기 전에 한 번 시뮬레이션을 해 보면서 안전성을 검증하려 한다. 이를 도와주는 프로그램을 작성하시오.

잘못된 명령에는 다음의 두 가지가 있을 수 있다.

  1. Robot X crashes into the wall: X번 로봇이 벽에 충돌하는 경우이다. 즉, 주어진 땅의 밖으로 벗어나는 경우가 된다.
  2. Robot X crashes into robot Y: X번 로봇이 움직이다가 Y번 로봇에 충돌하는 경우이다.
# 2174
import sys
input = lambda: sys.stdin.readline().strip()

# 1. L : 로봇이 향하고 있는 방향을 왼쪽으로 90도 회전
# 2. R : 로봇이 향하고 있는 방향을 오른쪽으로 90도 회전
# 3. F : 로봇이 향하고 있는 방향을 기준으로 앞으로 한 칸 이동
# 4. 충돌 발생 시 종료

a, b = map(int, input().split())
n, m = map(int, input().split())
NWES = ["N", "E", "S", "W"]

di, dj = [1, 0, -1, 0], [0, 1, 0, -1]
robot = []
for _ in range(n):
    string = input().split()
    x, y, d = int(string[0]), int(string[1]), NWES.index(string[2])
    robot.append([x, y, d])
    
def command(rob, com):
    x, y, d = robot[rob-1][0], robot[rob-1][1], robot[rob-1][2]
    
    if com == "L":
        d -= 1
        if d < 0 :
            d += 4
            
    elif com == "R":
        d += 1
        if d > 3:
            d -= 4
            
    else:
        x, y = x + dj[d], y + di[d]
        
        if x < 1 or b < y or x > a or 0 >= y:
            print("Robot " + str(rob) + " crashes into the wall")
            exit(0)
            
        for i in range (n):
            if i != rob-1 and robot[i][0] == x and robot[i][1] == y:
                print("Robot " + str(rob) + " crashes into robot " + str(i+1))
                exit(0)
                
    robot[rob-1] = [x, y, d]
    
for _ in range(m):
    string = input().split()
    rob, com, re = int(string[0]), string[1], int(string[2])
    for _ in range(re):
        command(rob, com)
        
print("OK")

백준 2174 로봇 시뮬레이션

0개의 댓글