본문 바로가기
Algorithm(BOJ, Python)/Simulation

[백준_2174] 로봇 시뮬레이션 python

by kurooru 2022. 9. 16.

dx, dy 테크닉을 이해하고 있으면,

그리 어렵지 않게 해결할 수 있는 문제였다.

# a, b 입력
a, b = map(int, input().split())

# n, m 입력
n, m = map(int, input().split())

# 로봇들의 정보를 담아 줄 리스트
robot_data = [0]

# mapper
mapper = {
    'N': 0,
    'E': 1,
    'S': 2,
    'W': 3,
}

# 리스트에 로봇들 정보 담아주기
for _ in range(n):
    x, y, dir = input().split()
    x, y = int(x), int(y)
    robot_data.append([x, y, mapper[dir]])

# 함수들
# turn_left(robot_num, times)
def turn_left(robot_num, times):
    
    # 전역 변수 선언
    global robot_data
    
    # 반복횟수만큼
    for _ in range(times):
        # 방향을 왼쪽으로 돌려주기
        robot_data[robot_num][2] = (robot_data[robot_num][2] - 1 + 4) % 4

# turn_right(robot_num, times)
def turn_right(robot_num, times):
    
    # 전역 변수 선언
    global robot_data

    # 반복횟수만큼
    for _ in range(times):
        # 방향을 오른쪽으로 돌려주기
        robot_data[robot_num][2] = (robot_data[robot_num][2] + 1) % 4

# go_foward(robot_num)
def go_foward(robot_num):
    
    # 전역 변수 선언
    global robot_data

    # 현재 로봇의 방향
    curr_dir = robot_data[robot_num][2]

    # dxs, dys -> 북 동 남 서 순서
    dxs, dys = [0, 1, 0, -1], [1, 0, -1, 0]

    # x 좌표 교체
    robot_data[robot_num][0] = robot_data[robot_num][0] + dxs[curr_dir]

    # y 좌표 교체
    robot_data[robot_num][1] = robot_data[robot_num][1] + dys[curr_dir]

# crashed(robot_num)
def crashed(robot_num):
    
    # 로보트들 중
    for i in range(1, len(robot_data)):    
        # 현재 로보트가 아니면서, 좌표가 겹치는 로보트가 있으면,
        if i != robot_num and robot_data[robot_num][0] == robot_data[i][0] and robot_data[robot_num][1] == robot_data[i][1]:
            # 그 로보트의 번호를 반환
            return i
    
    # 없다면, 실패
    return False

# in_range(robot_num)
def in_range(robot_num):
    return 0 < robot_data[robot_num][0] <= a and 0 < robot_data[robot_num][1] <= b

# 결과들을 저장할 리스트
results = []

for i in range(m):  
    # 명령을 내릴 로봇의 숫자, 명령의 종류, 반복 횟수
    robot_num, order, times = input().split()

    robot_num, times = int(robot_num), int(times)

    # 명령이 L인 경우
    if order == 'L':
        # 로봇을 좌로 90도 회전시켜주기
        turn_left(robot_num, times)
    
    # 명령이 R인 경우
    elif order == 'R':
        # 로봇을 우로 90도 회전시켜주기
        turn_right(robot_num, times)
    
    # 명령이 F인 경우
    else:
        
        # 반복 횟수 만큼
        for _ in range(times):
            
            # 전진
            go_foward(robot_num)

            # 충돌했으면,
            if crashed(robot_num):
                # 충돌기록
                results.append('Robot %d crashes into robot %d'%(robot_num, crashed(robot_num)))
            
            # 밖으로 벗어났으면
            if not in_range(robot_num):
                # 벗어남을 기록
                results.append('Robot %d crashes into the wall'%(robot_num))

# 아무일도 안일어났으면,
if not results:
    print('OK')
# 일어났으면
else:
    # 가장 먼저 일어난 사건을 출력
    print(results[0])