M
: 정사각형 S의 한 변의 길이
n
: 수행할 명령어 개수
(0, 0) 위치에서 동쪽을 본 상태에서 N개의 명령에 따라 이동했을 때 로봇의 최종 위치를 출력하는 문제이다.
🤖 명령어 정리
MOVE d
: 향하는 방향으로 d만큼 이동TURN 0
: 현재 위치에서 왼쪽으로 90도 회전TURN 1
: 현재 위치에서 오른쪽으로 90도 회전- 모든 명령은 명령 수행 후 S의 경계 또는 내부에 있어야만 유효❗️
움직임은 로봇이 바라보고 있는 방향의 영향을 받기 때문에 방향에 대한 정보를 따로 정의해준다.
→ 동북서남을 directions = [(1, 0), (0, 1), (-1, 0), (0, -1)]
으로 정의하고 인덱스로 접근한다.
TURN 0
→ 현재 방향 정보에 -1
TURN 1
→ 현재 방향 정보에 +1
명령어를 저장한 리스트를 하나씩 접근하면서 방향에 맞게 이동해주면 된다.
일련의 명령어 열을 이루는 각 명령어가 모두 유효하다면, 이 명령어 열을 유효하다고 한다.
라고 했으므로, 로봇이 이동 중에 M * M 크기의 영역 S를 나간다면 명령어열이 유효하지 않게 된다.
→ 이동 후 영역 내에 있는지 확인한다.
for문으로 명령어 접근 →
최종 시간복잡도
로 최악의 경우 가 되는데, 이는 1초 내에 연산 가능하다.
명령어 하나하나에 접근하면서 현재 위치 연산하기
location += directions[now_direction] * int(order[1])
^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'O'
# 명령어 입력
orders = [list(input().rstrip()) for _ in range(n)]
split()
로 입력받도록 변경했다.location += directions[now_direction] * int(order[1])
append()
가 되었다.-1
만 나왔다. 이동 방향을 바꾸는 코드가 잘못된 것 같다. # 왼쪽 90도 회전
if order[1] == '0':
now_direction = (now_direction - 1) % 4
# 오른쪽 90도 회전
else:
now_direction = (now_direction + 1) % 4
+1
, 오른쪽 회전 시엔 현재 방향 인덱스에 -1
을 해주어야 하는데 반대로 입력해서 잘못된 결과를 얻었다.import sys
input = sys.stdin.readline
# M, n 입력
M, n = map(int, input().split())
# 명령어 입력
orders = [input().split() for _ in range(n)]
# 방향 정의
directions = [(1, 0), (0, 1), (-1, 0), (0, -1)]
# 방향 상태 초기화 (동쪽)
now_direction = 0
# 위치 초기화
location = [0, 0]
# 유효 확인 플래그 정의
valid = True
# 명령어 수행
for order in orders:
# 방향 전환 명령어라면
if order[0] == 'TURN':
# 왼쪽 90도 회전
if order[1] == '0':
now_direction = (now_direction + 1) % 4
# 오른쪽 90도 회전
else:
now_direction = (now_direction - 1) % 4
# 움직이는 명령어라면
else:
# 현재 방향으로 이동
location[0] += directions[now_direction][0] * int(order[1])
location[1] += directions[now_direction][1] * int(order[1])
if location[0] < 0 or location[0] > M or location[1] < 0 or location[1] > M:
# 유효하지 않음 표시
valid = False
break
# 결과 출력
if not valid:
print(-1)
else:
print(' '.join(map(str, location)))