daniel7481의 개발일지

[BOJ] 2174 로봇 시뮬레이션 본문

BOJ

[BOJ] 2174 로봇 시뮬레이션

daniel7481 2022. 7. 8. 19:10
반응형

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

 

2174번: 로봇 시뮬레이션

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

www.acmicpc.net

풀이

재밌는 시뮬레이션 문제다. 처음에 문제에서 로봇이 명령을 내린다는 부분에서 헷갈렸는데, 간단히 그 로봇이 명령을 수행한다라고 이해하면 되겠다. 명령은 순서대로 실행되며, 한 명령이 실행 중일 때는 다른 명령을 실행 할 수 없다라고 이해하였다. 외국 문제를 번역했다보니 설명이 다소 부족하지만 각 로봇에 대하여 처음에 입력 받은 로봇을 1번 로봇이라 하고, 그 뒤로도 N번 로봇이라고 칭하면 되겠다. 로봇에 대하여 좌표, 방향을 해싱을 사용하여 할당하였다. 입력 받은 로봇의 좌표에 대하여 격자 위에 로봇의 번호를 할당해주었다. 나중에 부딪혔을 때 어떤 로봇이랑 부딪혔는지 확인하기 위함이다. 딕셔너리 자료구조를 사용하여 N을 키로 가지고 x, y, 방향을 value 값을 가지는 딕셔너리 dic을 선언하여 주었고, 일단 모든 명령을 입력 받아 commands 리스트에 할당해준 후, 순차적으로 탐색하며 반복 횟수만큼 명령(L, R, F)에 따라 반복해주었다. 여기서 만약 벽에 부딪혔다면(x, y가 0부터 A-1, B-1 안에 포함되지 않는다면) wall_flag를 True로 업데이트하고 wall_robot에 벽에  부딪힌 로봇의 번호를 할당해주었다. 만약 이동할려고 하는 좌표에 다른 로봇이 있다면 현재 로봇의 번호와 부딪힌 로봇의 번호를 robot_crash 리스트에 할당해주었다. 마지막에는 벽에 부딪혔는지, 다른 로봇이랑 부딪혔는지, 이상이 없는지를 조건으로 if문을 사용하여 출력해주었다.

import sys
input = lambda: sys.stdin.readline().rstrip()
A, B = map(int, input().split())
dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0] # N, W, S, E
n, m = map(int, input().split())
wall_flag = False
robot_flag = False
mtr = [[0 for _ in range(B)]for _ in range(A)]
robot_hash = {}
for i in range(n):
    x, y, dir = input().split()
    x, y = int(x), int(y)
    x -= 1
    y -= 1
    if dir == "N":
        dir = 0
    elif dir == "W":
        dir = 1
    elif dir == "S":
        dir = 2
    elif dir == "E":
        dir = 3
    robot_hash[i+1] = [x, y, dir]
    mtr[x][y] = i+1
wall_robot = 0
robot_crash = []
commands = []
for _ in range(m):
    commands.append(list(input().split()))
for comman in commands:
    robot = comman[0]
    com = comman[1]
    lit = comman[2]
    robot, lit = int(robot), int(lit)
    if com == 'F':
        mtr[robot_hash[robot][0]][robot_hash[robot][1]] = 0
        for _ in range(lit):
            robot_hash[robot][0] += dx[robot_hash[robot][2]]
            robot_hash[robot][1] += dy[robot_hash[robot][2]]
            if robot_hash[robot][0] < 0 or robot_hash[robot][1] < 0 or robot_hash[robot][0] >= A or robot_hash[robot][1] >= B:
                wall_flag = True
                wall_robot = robot
                break
            if mtr[robot_hash[robot][0]][robot_hash[robot][1]] != 0:
                robot_flag = True
                robot_crash = [robot, mtr[robot_hash[robot][0]][robot_hash[robot][1]]]
                break
        if wall_flag or robot_flag:
            break
        mtr[robot_hash[robot][0]][robot_hash[robot][1]] = robot
    elif com == "L":
        for _ in range(lit):
            robot_hash[robot][2] += 1
            if robot_hash[robot][2] == 4:
                robot_hash[robot][2] = 0
    else:
        for _ in range(lit):
            robot_hash[robot][2] -= 1
            if robot_hash[robot][2] == -1:
                robot_hash[robot][2] = 3
if wall_flag:
    print('Robot {0} crashes into the wall'.format(wall_robot))
elif robot_flag:
    print('Robot {0} crashes into robot {1}'.format(robot_crash[0], robot_crash[1]))
else:
    print('OK')
반응형

'BOJ' 카테고리의 다른 글

[BOJ]18428 감시 피하기  (0) 2022.07.14
[프로그래머스]2020 KAKAO BLIND RECRUITMENT - 문자열 압축  (0) 2022.07.11
[BOJ]1935 후위표기식2  (0) 2022.07.08
[BOJ]1918 후위 표기식  (0) 2022.07.08
[BOJ]8972 미친 아두이노  (0) 2022.07.08