티스토리 뷰

728x90

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

 

2174번: 로봇 시뮬레이션

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

www.acmicpc.net


  • 문제 : 

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

 

 

 


  • 풀이 :

진짜 스트레스 많이 받은 문제였다.

구현 자체는 간단하게 떠올릴 수 있다.

로봇들의 번호와 현재 좌표, 방향을 저장하고 명령을 수행하며 다른 로봇과 부딪히거나 벽에 닿을 경우 정해진 메시지를 출력하면 된다. 구현에만 집중하다보니 오타 + 조건 빼먹기를 너무 심하게해서 7번이나 틀렸다.

 

첫 번째로, 인덱스 에러는 dy배열에서 ,(콤마)를 빼먹어서 length가 3으로 인식되어 인덱스 3의 방향(서쪽)으로 이동할 때 인덱스 에러가 난것이였다. 

두 번째로, 정해진 명령을 전부 완수할 경우 OK를 출력해야하는데 이를 빼먹었다.

 

그래도 재밌게 풀었던 문제였다. 실제 코딩테스트였으면 이문제풀고 멘탈나가서 탈주했을 것 같다. ㅋㅋ....


  • 소스코드 : 

dx = [-1, 0, 1, 0]
dy = [0, 1, 0,-1]
A,B = map(int,input().split())
N,M = map(int,input().split())
command = []
robot = dict()
board = [[0]*A for _ in range(B)]
for i in range(1,N+1):
    x,y,d = input().split()
    if d == "N":
        d = 0
    elif d == "E":
        d = 1
    elif d == "S":
        d = 2
    else:
        d = 3
    board[(B-int(y))][int(x)-1] = 1
    robot[i] = [(B-int(y)),int(x)-1,d]
for _ in range(M):
    x,y,d = input().split()
    command.append([int(x),y,int(d)])
for R, C, repeat in command:
    for _ in range(repeat):
        if C == "F":
            curr_x, curr_y, direction = robot[R]
            next_x = curr_x + dx[direction]
            next_y = curr_y + dy[direction]
            if not (0 <= next_x < B and 0 <= next_y < A):
                print("Robot",R,"crashes into the wall")
                exit()
            elif board[next_x][next_y] == 1:
                for i in robot:
                    if next_x == robot[i][0] and next_y == robot[i][1]:
                        print("Robot",R,"crashes into robot",i)
                        exit()
            else:
                board[curr_x][curr_y] = 0
                board[next_x][next_y] = 1
                robot[R][0] = next_x
                robot[R][1] = next_y
        elif C == "L":
            robot[R][2] = (robot[R][2]-1)%4
        else:
            robot[R][2] = (robot[R][2]+1)%4
print("OK")
320x100
댓글
© 2022 WonSeok, All rights reserved