[ BOJ / Python ] 2174번 로봇 시뮬레이션

황승환·2022년 5월 31일
0

Python

목록 보기
318/498


이번 문제는 주어진 명령 순서대로 각 로봇들을 움직이도록 하는 문제였다. 명령들을 모두 처리하는 동안 범위를 벗어나거나 로봇들 간의 위치가 겹치지 않을 경우에는 OK를 출력하고, 그렇지 않다면 해당하는 문장을 출력해야 한다. 이를 위해 함수로 범위를 벗어나는 경우와 부딪히는 경우를 따로 구현하였고, 로봇의 방향이 알파벳으로 주어지므로, 매핑 딕셔너리를 만들어 바로바로 바꿔서 넣어주었다. 방향 지정은 이 문제의 경우 y좌표가 클수록 아래로 가는 것이 아닌 위로 가므로 북쪽과 남쪽을 다른 문제들과 반대로 설정하였다.

Code

a, b=map(int, input().split())
n, m=map(int, input().split())
robots=[]
dy, dx=[0, -1, 0, 1], [1, 0, -1, 0]
mapping={'E': 0, 'S': 1, 'W': 2, 'N': 3}
grid=[[0 for _ in range(a)] for _ in range(b)]
for i in range(n):
    c, r, d=map(str, input().split())
    d=mapping[d]
    robots.append([int(r)-1, int(c)-1, d])
    grid[int(r)-1][int(c)-1]=i+1
commands=[]
for i in range(m):
    num, com, s=map(str, input().split())
    commands.append((int(num), com, int(s)))
def chk_range(y, x):
    if 0<=y<b and 0<=x<a:
        return True
    return False
def chk_crash(y, x):
    if grid[y][x]>0:
        return True
    return False
def move_robots():
    for rb, cm, sz in commands:
        if cm=='F':
            for i in range(1, sz+1):
                grid[robots[rb-1][0]][robots[rb-1][1]]=0
                robots[rb-1][0], robots[rb-1][1]=robots[rb-1][0]+dy[robots[rb-1][2]], robots[rb-1][1]+dx[robots[rb-1][2]]
                if not chk_range(robots[rb-1][0], robots[rb-1][1]):
                    print("Robot {0} crashes into the wall".format(rb))
                    quit()
                if chk_crash(robots[rb-1][0], robots[rb-1][1]):
                    print("Robot {0} crashes into robot {1}".format(rb, grid[robots[rb-1][0]][robots[rb-1][1]]))
                    quit()
                grid[robots[rb - 1][0]][robots[rb - 1][1]] = rb
        elif cm=='L':
            for _ in range(sz):
                robots[rb-1][2]=(robots[rb-1][2]+3)%4
        elif cm=='R':
            for _ in range(sz):
                robots[rb-1][2]=(robots[rb-1][2]+1)%4
    print("OK")
move_robots()

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글