즐거운 PS 👩‍💻🥰

[백준-파이썬] 2174: 로봇 시뮬레이션

dalin❤️ 2021. 10. 8. 10:11

문제 보러 가기!

아이디어 😍

뭔가 특별한 알고리즘을 쓰진 않은 것 같다.
다만 y축(column) 받을 때 인덱스가 좀 헷갈렸다.. (column 인덱스는 위에서 아래로 갈 때 0부터 수가 증가하는데, 문제에서는 아래에서 위로 갈 때 1부터 수가 증가하는 모양으로 입력이 들어온다.)
그것만 주의하면 괜찮을 것 같다 !

코드 😆

import collections

direction_move_index = {'W': (0, -1), 'S': (1, 0), 'E': (0, 1), 'N': (-1, 0)}
r_direction = ['N', 'E', 'S', 'W']  # 오른쪽으로
l_direction = ['N', 'W', 'S', 'E']  # 왼쪽으로


def crash_wall(i, j):
    """
    범위 밖으로 가는지 체크
    :return:
    """
    if 0 <= i < B and 0 <= j < A:
        return True  # 범위 내
    return False  # 범위 벗어님


def crash_robot(robot_name: int):
    """
    다른 로봇과 부딪치는지 체크
    :param i:
    :param j:
    :return:
    """
    for k in range(1, N + 1):  # 로봇들 쯕 보면서
        if k != robot_name:  # 그 로봇이 아닌데
            if robots[robot_name][0] == robots[k][0] and robots[robot_name][1] == robots[k][1]:  # 위치가 같으면
                return k
    return False


def turn_L(robot_name: int, cnt: int):
    """
    왼쪽으로 90도 회전
    :param i:
    :param j:
    :return:
    """
    d = robots[robot_name][2]  # 로봇의 현재 방향
    cnt = cnt % 4
    if d == 'N':
        cnt = cnt % 4

    elif d == 'E':
        cnt = (cnt + 3) % 4

    elif d == 'S':
        cnt = (cnt + 2) % 4
    elif d == 'W':
        cnt = (cnt + 1) % 4
    return l_direction[cnt]


def turn_R(robot_name: int, cnt: int):
    """
    왼쪽으로 90도 회전
    :param i:
    :param j:
    :return:
    """
    d = robots[robot_name][2]  # 로봇의 현재 방향
    cnt = cnt % 4
    if d == 'N':
        cnt = cnt % 4

    elif d == 'E':
        cnt = (cnt + 1) % 4

    elif d == 'S':
        cnt = (cnt + 2) % 4
    elif d == 'W':
        cnt = (cnt + 3) % 4
    return r_direction[cnt]


# def forward_go(robot_name: int, cnt: int):
#     """
#     로봇을 지금 바라보고 있는 방향으로 cnt만큼 움직이게 하기
#     :param robot_name:
#     :param dire:
#     :param cnt:
#     :return:
#     """
#     i, j = robots[robot_name][:2]  # 로봇 원래 위치
#     dire = robots[robot_name][2]  # 로봇 원래 방향
#
#     ni = i + direction_move_index[dire][0] * cnt
#     nj = j + direction_move_index[dire][1] * cnt
#
#     robots[robot_name][0] = ni
#     robots[robot_name][1] = nj
#     return ni, nj


A, B = map(int, input().split())
N, M = map(int, input().split())
robots = collections.defaultdict(tuple)

for i in range(1, N + 1):  # 로봇 초기 위치, 방향 입력 받기
    x, y, d = input().split()
    robots[i] = [B - int(y), int(x) - 1, d]  # y, x좌표, 방향을 입력받음

# print(robots)
def sol():
    for _ in range(M):  # 명령
        robot_name, command, command_cnt = input().split()
        robot_name = int(robot_name)
        command_cnt = int(command_cnt)
        i, j = robots[robot_name][:2]  # 로봇의 명령 수행 이전 위치

        if command == 'L':
            d = turn_L(robot_name, command_cnt)
            robots[robot_name][2] = d
        elif command == 'R':
            d = turn_R(robot_name, command_cnt)
            robots[robot_name][2] = d

        elif command == 'F':
            i, j = robots[robot_name][:2]  # 로봇 원래 위치
            dire = robots[robot_name][2]  # 로봇 원래 방향

            for k in range(command_cnt):
                i = i + direction_move_index[dire][0]
                j = j + direction_move_index[dire][1]

                robots[robot_name][0] = i
                robots[robot_name][1] = j

                tmp = crash_robot(robot_name)  # 혹시 다른 로봇과 충돌했는지

                if tmp:
                    print('Robot {} crashes into robot {}'.format(robot_name, tmp))
                    return

                if crash_wall(i, j) == False:  # 혹시 범위 넘었는지
                    print('Robot {} crashes into the wall'.format(robot_name))
                    return

        # print(robots)

    else:  # 괜찮으면
        print('OK')


sol()

그리고 원래 이 문제가 있는 사이트인 NCPC 2005에 가서 input, output을 받아서 하나씩 돌려보면서 수정했다 !

728x90