난이도 : Silver 4
Link : https://www.acmicpc.net/problem/13567
Tag : 구현, 시뮬레이션
풀이일자 : 2024년 9월 17일
N : 명령어의 개수
M : 이동할 수 있는 면적 크기
명령어가 들어올 때마다 이동하는 위치가 주어진 좌표에서 벗어나는지 안벗어나는지 확인하면 되므로
시간 복잡도는 명령어 갯수와 비례한다 따라서 O(N) 이다.
현재 위치는 (0,0)이고 이도할 수 있는 곳은 4방향이다.
따라서 방향을 설정하고 이동했을 때 주어진 좌표 이내이면 현재 좌표를 업데이트 해주고, 주어진 좌표보다 크다면 -1을 출력하게 접근하면 될것이라고 생각한다.
방향은 현재 90도 방향으로 돌리는 명령어를 사용하고 있으므로 실제로 이동하는 방향을 알아야 한다.
direction = 0 # 0 오른쪽 1 위 2 왼쪽 3 아래
이런식으로 각각의 숫자에 방향을 매핑해 놓을 생각이다.
또한 유효한 명령인지 아닌지를 구분지어야 하기 때문에 answer 변수를 이용해서 이동 불가능한 좌표일 경우 -1을 answer에 저장해 구분한다.
n,m을 입력 받는다.
direction변수에 방향을 매핑한다 (초기값 0 : 오른쪽)
answer와 answer_x,answer_y를 초기화 한다
초기 좌표 x,y를 설정한다.
N번만큼 for문을 만든다.
- command와 cnt를 입력받는다 (command는 명령어 유형, cnt는 좌표 또는 방향이다)
if command == 'MOVE': if direction == 0: #우측 if x + cnt <= m: y, x = y, x + cnt else: answer = -1 break elif direction == 1: if y + cnt <= m: y, x = y + cnt, x else: answer = -1 break```
이런식으로 move에 대한 명령어를 처리한다.
elif command == 'TURN': if cnt == 0: #왼쪽 90 도 if direction == 3 : direction = 0 else: direction += 1 elif cnt == 1: #오른쪽 90도 if direction == 0 : direction = 3 else: direction -= 1
이런식으로 Turn에 대한 명령어를 처리한다.
m,n = map(int,input().split()) # m : gird 크기 n: 명령 개수
direction = 0 # 0 오른쪽 1 위 2 왼쪽 3 아래
answer = 0
answer_x, answer_y = 0, 0
y,x = 0,0
for i in range(n):
command, cnt = map(str, input().split())
cnt = int(cnt)
if command == 'MOVE':
if direction == 0: #우측
if x + cnt <= m:
y, x = y, x + cnt
else:
answer = -1
break
elif direction == 1:
if y + cnt <= m:
y, x = y + cnt, x
else:
answer = -1
break
elif direction == 2:
if x - cnt >= 0:
y, x = y, x - cnt
else:
answer = -1
break
elif direction == 3:
if y - cnt >= 0:
y, x = y - cnt, x
else:
answer = -1
break
elif command == 'TURN':
if cnt == 0: #왼쪽 90 도
if direction == 3 :
direction = 0
else:
direction += 1
elif cnt == 1: #오른쪽 90도
if direction == 0 :
direction = 3
else:
direction -= 1
if answer != -1:
answer_x, answer_y = x, y
print(answer_x, answer_y)
else:
print(answer)