새소식

PS/백준

[백준/2174] 로봇 시뮬레이션 (Python)

  • -

Problem : https://www.acmicpc.net/problem/2174

 

2174번: 로봇 시뮬레이션

첫째 줄에 두 정수 A, B가 주어진다. 다음 줄에는 두 정수 N, M이 주어진다. 다음 N개의 줄에는 각 로봇의 초기 위치(x, y좌표 순) 및 방향이 주어진다. 다음 M개의 줄에는 각 명령이 명령을 내리는 순

www.acmicpc.net

 

Difficulty : Gold 5

 

Status : Solved

 

Time : 00:19:56

 


 

문제 설명

 

더보기

 

가로 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를, 그 외의 경우에는 위의 형식대로 출력을 한다. 만약 충돌이 여러 번 발생하는 경우에는 가장 먼저 발생하는 충돌을 출력하면 된다.

 

입력 예시

 

5 4
2 2
1 1 E
5 4 W
1 F 7
2 F 7

 

출력 예시

 

Robot 1 crashes into the wall

 

 


 

풀이

 

구현 및 시뮬레이션 문제(난이도 : 중하). 이런 문제는 한 번 잘못 꼬이면 수많은 맞왜틀과 대면하는 나자신을 볼 수 있다... 조심하도록 하자.

 

로봇의 이동, 바라보는 뱡항, 그리고 한 번의 이동마다 검사를 요구한다. 이를 유연하게 하기 위해서 로봇의 위치정보를 저장한 2차원 리스트 및 로봇의 현재 상황을 저장한 리스트를 생성하였다.

 

이외에는 표준적으로 사용하는 리스트와 좌표가 약간 다르니, 이 점만 주의해서 구현하도록 하자.

 

풀이 코드



dx = [0, -1, 0, 1]
dy = [-1, 0, 1, 0]
dir = 'NWSE'

A, B = map(int, input().split())
N, M = map(int, input().split())
map_list = [[-1]*A for _ in range(B)]
robot_list = list()
for i in range(N) :
  x, y, d = input().split()
  x = int(x) - 1
  y = B - int(y)
  d = dir.index(d)
  map_list[y][x] = i
  robot_list.append([x, y, d])

def move(robot, num) :
  x, y, d = robot_list[robot]
  map_list[y][x] = -1
  for _ in range(num) :
    x, y = x + dx[d], y + dy[d]
    if not ( -1 < x < A and -1 < y < B ) :
      return 1, 0
    if map_list[y][x] > -1 :
      return 2, map_list[y][x]
  map_list[y][x] = robot
  robot_list[robot] = [x, y, d]
  return 0, 0

flg = True
for _ in range(M) :
  robot, order, num = input().split()
  robot, num = int(robot)-1, int(num)
  if order == 'L' :
    robot_list[robot][2] = (robot_list[robot][2] + num) % 4
  elif order == 'R' :
    robot_list[robot][2] = (robot_list[robot][2] - num) % 4
  else :
    result, crashed = move(robot, num)
    if result == 1 :
      print('Robot {} crashes into the wall'.format(robot+1))
      flg = False
      break
    if result == 2 :
      print('Robot {} crashes into robot {}'.format(robot+1, crashed+1))
      flg = False
      break
if flg :
  print('OK')

풀이 완료!

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.