▶2174 - 로봇 시뮬레이션
▶문제
가로 A(1≤A≤100), 세로 B(1≤B≤100) 크기의 땅이 있다. 이 땅 위에 로봇들이 N(1≤N≤100) 개 있다.
로봇들의 초기 위치는 x좌표와 y좌표로 나타난다. 위의 그림에서 보듯 x좌표는 왼쪽부터, y좌표는 아래쪽부터 순서가 매겨진다. 또한 각 로봇은 맨 처음에 NWES 중 하나의 방향을 향해 서 있다. 초기에 서 있는 로봇들의 위치는 서로 다르다.
이러한 로봇들에 M(1≤M≤100) 개의 명령을 내리려고 한다. 각각의 명령은 순차적으로 실행된다. 즉, 하나의 명령을 한 로봇에서 내렸으면, 그 명령이 완수될 때까지 그 로봇과 다른 모든 로봇에게 다른 명령을 내릴 수 없다. 각각의 로봇에 대해 수행하는 명령은 다음의 세 가지가 있다.
- L: 로봇이 향하고 있는 방향을 기준으로 왼쪽으로 90도 회전한다.
- R: 로봇이 향하고 있는 방향을 기준으로 오른쪽으로 90도 회전한다.
- F: 로봇이 향하고 있는 방향을 기준으로 앞으로 한 칸 움직인다.
간혹 로봇들에게 내리는 명령이 잘못될 수도 있기 때문에, 당신은 로봇들에게 명령을 내리기 전에 한 번 시뮬레이션을 해 보면서 안전성을 검증하려 한다. 이를 도와주는 프로그램을 작성하시오.
잘못된 명령에는 다음의 두 가지가 있을 수 있다.
- Robot X crashes into the wall: X번 로봇이 벽에 충돌하는 경우이다. 즉, 주어진 땅의 밖으로 벗어나는 경우가 된다.
- Robot X crashes into robot Y: X번 로봇이 움직이다가 Y번 로봇에 충돌하는 경우이다.
▶입력
첫째 줄에 두 정수 A, B가 주어진다. 다음 줄에는 두 정수 N, M이 주어진다. 다음 N개의 줄에는 각 로봇의 초기 위치(x, y좌표 순) 및 방향이 주어진다. 다음 M개의 줄에는 각 명령이 명령을 내리는 순서대로 주어진다. 각각의 명령은 명령을 내리는 로봇, 명령의 종류(위에 나와 있는), 명령의 반복 횟수로 나타낸다. 각 명령의 반복 횟수는 1 이상 100 이하이다.
▶출력
첫째 줄에 시뮬레이션 결과를 출력한다. 문제가 없는 경우에는 OK를, 그 외의 경우에는 위의 형식대로 출력을 한다. 만약 충돌이 여러 번 발생하는 경우에는 가장 먼저 발생하는 충돌을 출력하면 된다.
▶풀이
이번 문제는 단순 구현하면 되는 문제이다.
조건만 까다롭지 하나하나 세부적으로 파고 들어가면 금방 풀 수 있다.
하지만, 조건이 많고 까다롭다 보니 빼먹은 조건들도 있었고, 오타들로 인해서 4번이나 IndexError가 발생했다.
침착하게 하나씩 하면 금방 풀 수 있는 문제이다.
딱히 풀이법은 없고, 구현하는 문제이기에 코드만 보면 바로 이해할 수 있을 거다.
a, b = map(int, input().split())
n, m = map(int, input().split())
robots = []
command = []
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
for _ in range(n):
x, y, z = input().split()
if z == 'N':
d = 0
if z == 'E':
d = 1
if z == 'S':
d = 2
if z == 'W':
d = 3
robots.append([int(x), int(y), d])
for _ in range(m):
x, y, z = input().split()
command.append([int(x), y, int(z)])
for r, c, repeat in command:
for _ in range(repeat):
if c == 'F':
direction = robots[r - 1][2]
robots[r - 1][0] += dx[direction]
robots[r - 1][1] += dy[direction]
if robots[r - 1][0] > a or robots[r - 1][1] > b or robots[r - 1][0] <= 0 or robots[r - 1][1] <= 0:
print(f'Robot {r} crashes into the wall')
exit(0)
for j in range(n):
if j != r - 1:
if robots[r - 1][0] == robots[j][0] and robots[r - 1][1] == robots[j][1]:
print(f'Robot {r} crashes into robot {j + 1}')
exit(0)
if c == 'L':
robots[r - 1][2] = (robots[r - 1][2] - 1) % 4
if c == 'R':
robots[r - 1][2] = (robots[r - 1][2] + 1) % 4
print('OK')
'BOJ Code > Gold' 카테고리의 다른 글
[백준/BOJ] gold5 - 17251번 힘 겨루기 (Python) (0) | 2023.02.21 |
---|---|
[백준/BOJ] gold5 - 1240번 노드사이의 거리 (Python) (3) | 2023.02.13 |
[백준/BOJ] gold4 - 1197번 최소 스패닝 트리 (Python) (1) | 2023.02.07 |
[백준/BOJ] gold4 - 2295번 세 수의 합 (Python) (0) | 2023.02.06 |
[백준/BOJ] gold3 - 2629번 양팔저울 (Python) (2) | 2023.02.05 |