[백준] 로봇 (13567번)

Bae Jae Min·2024년 9월 16일

난이도 : 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에 저장해 구분한다.

📌 코드 설계하기

  1. n,m을 입력 받는다.

  2. direction변수에 방향을 매핑한다 (초기값 0 : 오른쪽)

  3. answer와 answer_x,answer_y를 초기화 한다

  4. 초기 좌표 x,y를 설정한다.

  5. 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)

0개의 댓글