백준 2174 로봇 시뮬레이션(with Python)

daeungdaeung·2021년 8월 4일

내가 생각한 Solution

문제에서 생각해볼 점

  • 딱히 어려운 문제는 아니지만 문제 자체가 복잡하여 시간이 걸리는 문제

  • 제 생각이 많이 들어간 부분만 설명하겠습니다.

  • 위 그림에서 반복 횟수가 짝수인 경우는 L, R 이 의미가 없습니다. 어느 방향으로 회전하든 결국 같은 방향을 가리킵니다.

    • Ex) 입력된 명령이 1 L 6, 1 R 6 인 경우를 직접 비교해보세요.
  • 반복 횟수가 홀수인 경우는 반대가 됩니다.

    • Ex) 명령이 1 L 7, 1 R 7 인 경우

      • 전자의 경우는 S 남쪽을 가리킬 것이고, 후자의 경우 N 북쪽을 가리킬 것입니다.
  • 위의 내용을 통해서 짝수 반복일 경우는 두 경우를 나누어 생각할 필요가 없고 홀수인 경우만 두 경우(왼쪽 회전인지 오른쪽 회전인지)를 나누어 생각하면 됩니다.

  • 그리고 방향에 숫자를 적어놨는데 실제 코드상에서 위의 그림처럼 방향에 숫자를 mapping했습니다.

코드 구현

A, B = map(int, input().split())
N, M = map(int, input().split())

brd = [[0] * A for _ in range(B)]

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

NESW_list = [
    [-1, 0],
    [0, 1],
    [1, 0],
    [0, -1]
]

# 로봇 위치 및 방향 정보 받기
robots = []
for i in range(N):
    x, y, d = input().split()
    r, c = B - int(y), int(x) - 1
    robots.append([r, c, NESW_dic[d]])
    brd[r][c] = i+1

# 명령 실행
flag = False
for i in range(M):
    robot, instruction, loop = input().split()
    robot = int(robot)
    loop = int(loop)

    r, c, d = robots[robot-1]
    if instruction == 'L' or instruction == 'R':
        new_d = (d + loop) % 4
        if loop % 2:
            if instruction == 'L':
                new_d = (new_d + 2) % 4
        robots[robot-1] = [r, c, new_d]
    else:
        dr, dc = NESW_list[d]
        for j in range(1, loop+1):

            if 0 <= r + dr < B and 0 <= c + dc < A:
                if brd[r+dr][c+dc]:
                    flag = True
                    print(f'Robot {brd[r][c]} crashes into robot {brd[r + dr][c + dc]}')
                    break
                else:
                    brd[r][c] = 0
                    r, c = r + dr, c + dc
                    brd[r][c] = robot
                    robots[robot-1] = [r, c, d]
            else:
                flag = True
                print(f'Robot {brd[r][c]} crashes into the wall')
                break
    if flag:
        break

if not flag:
    print('OK')
profile
개발자가 되고싶읍니다...

0개의 댓글