[백준 Python] 2174번 로봇 시뮬레이션

iwtkmn_0219·2023년 2월 20일
0

백준 Python

목록 보기
32/32
post-thumbnail

백준 2174 로봇 시뮬레이션

문제

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

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

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

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

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

입력

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

출력

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

풀이 및 회고

풀이

구현 + 시뮬레이션 문제이므로 주어진 조건을 충족시키며 문제를 풀면 된다. 다만, 충돌에 두 가지 분기가 있다는 점과 어떠한 방식으로 각 로봇의 상태와 좌표를 저장하고 다룰 것 인지는 잘 선택해야한다. 본인의 경우 로봇의 x좌표 y좌표 방향(0: N, 1: W, 2: S, 3: E)을 2차원 배열에 저장하였으며, NWSE에 대한 좌표 이동 정보는 따로 저장하였다. 또한 각 로봇의 상태가 업데이트 될 경우 실제 board에서 다른 로봇과 충돌하는 지에 대한 검사를 마친 후 board에 업데이트 하는 방식으로 코드를 구성하였다.

회고

요즘 느끼는 구현 + 시뮬레이션 문제는 진짜 개발하는 느낌이 들어서 재밌는 것 같다. 어디까지나 느낌일 뿐이지만 어쨌든. 구현 + 시뮬레이션 문제나 좀 풀어볼까?

코드

nwse = [[1, 0], [0, -1], [-1, 0], [0, 1]]

a, b = map(int, input().split())
board = [[0] * (a + 1) for _ in range(b + 1)]
n, m = map(int, input().split())
robots = [[0] * 3 for _ in range(n + 1)]
for i in range(1, n + 1):
    line = input().split()
    x = int(line[0])
    y = int(line[1])
    direction = line[2]
    robots[i][0] = x
    robots[i][1] = y
    if direction == "N":
        robots[i][2] = 0
    elif direction == "W":
        robots[i][2] = 1
    elif direction == "S":
        robots[i][2] = 2
    else:
        robots[i][2] = 3
    board[y][x] = i

ERROR = False
for _ in range(m):
    line = input().split()
    robot_number = int(line[0])
    order = line[1]
    loop = int(line[2])
    if order == "F":
        forward = robots[robot_number][2]
        for _ in range(loop):
            prev_x = robots[robot_number][0]
            prev_y = robots[robot_number][1]
            robots[robot_number][0] += nwse[forward][1]
            robots[robot_number][1] += nwse[forward][0]
            xx = robots[robot_number][0]
            yy = robots[robot_number][1]
            if 0 < xx <= a and 0 < yy <= b:
                if board[yy][xx] == 0:
                    board[yy][xx] = robot_number
                    board[prev_y][prev_x] = 0
                else:
                    print(f"Robot {robot_number} crashes into robot {board[yy][xx]}")
                    ERROR = True
                    break
            else:
                print(f"Robot {robot_number} crashes into the wall")
                ERROR = True
                break
    elif order == "L":
        robots[robot_number][2] = (robots[robot_number][2] + loop) % 4
    elif order == "R":
        robots[robot_number][2] = (robots[robot_number][2] - loop) % 4
    if ERROR:
        break
if not ERROR:
    print("OK")

>> iwtkmn0219의 Github <<

0개의 댓글