QA & Engineering Blog

A Blog about Quality · Automation · Engineering

🏠 홈으로

2174. 로봇 시뮬레이션

업데이트 시간 : 2023-05-30 09:35:44 +0000

[Gold V] 로봇 시뮬레이션 - 2174

문제 링크

성능 요약

메모리: 114328 KB, 시간: 116 ms

분류

구현, 시뮬레이션

문제 설명

가로 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번 로봇에 충돌하는 경우이다.

입력

첫째 줄에 두 정수 A, B가 주어진다. 다음 줄에는 두 정수 N, M이 주어진다. 다음 N개의 줄에는 각 로봇의 초기 위치(x, y좌표 순) 및 방향이 주어진다. 다음 M개의 줄에는 각 명령이 명령을 내리는 순서대로 주어진다. 각각의 명령은 명령을 내리는 로봇, 명령의 종류(위에 나와 있는), 명령의 반복 회수로 나타낸다. 각 명령의 반복 회수는 1이상 100이하이다.

출력

첫째 줄에 시뮬레이션 결과를 출력한다. 문제가 없는 경우에는 OK를, 그 외의 경우에는 위의 형식대로 출력을 한다. 만약 충돌이 여러 번 발생하는 경우에는 가장 먼저 발생하는 충돌을 출력하면 된다.

💡 Solutions

📄 로봇 시뮬레이션.py

A, B = map(int,input().split())
N, M = map(int,input().split())
matrix = [[ 0 for _ in range(B)] for _ in range(A)]

robo_dir = dict()
             #북     # 동    #남  # 서  
dir_xy = ((0, 1),(1, 0),(0, -1),(-1, 0))

dir = {
    'N' : 0,
    'S' : 2,
    'E' : 1,
    'W' : 3,
}
for i in range(1,N+1):
    x, y, d = input().split()
    x = int(x)-1
    y = int(y)-1
    matrix[x][y] = i
    robo_dir[i] = [dir[d],(x,y)]

def order():
    for j in range(M):
        X, o, cnt = input().split()
        X = int(X)
        cnt = int(cnt)

        if o == 'L':
            robo_dir[X][0] = (robo_dir[X][0]-1*cnt) % 4
        elif o == 'R':
            robo_dir[X][0] = (robo_dir[X][0]+cnt) % 4
        else:
            dx,dy = dir_xy[robo_dir[X][0]]
            for _ in range(1,cnt+1):
                x,y = robo_dir[X][1]
                nx = x + dx
                ny = y + dy
                matrix[x][y] = 0
                if nx < 0 or ny < 0 or nx >= A or ny >= B: 
                    print(f'Robot {X} crashes into the wall')
                    return
                if matrix[nx][ny] != 0 :
                    print(f'Robot {X} crashes into robot {matrix[nx][ny]}')
                    return
                matrix[nx][ny] = X
                robo_dir[X][1] = (nx,ny)
    print('OK')
    return

order()