코딩 챌린지 9일차 : 13567번 로봇(S4)

이서진·2024년 9월 17일
0

13567 : 로봇 - 문제 링크

1. 문제 탐색하기

입력

m 정사각형의 한 변의 길이
n 명령어의 수
명령어, 인수 로봇이 수행할 명령어

구하고자 하는 것

모든 명령어 수행 후 로봇의 최종 위치

알고리즘 설계

구현/시뮬레이션 문제이므로 명령어를 따라 위치를 계산해나가면 된다
초기 방향은 동쪽, 초기 위치는 (0, 0)으로 설정

명령어가 TURN일 때, 뒤의 인수가 0이라면 방향을 시계방향으로 90도,
인수가 1이라면 반시계방향으로 90도 돌려준다.

  • 동쪽, 북쪽, 서쪽, 남쪽을 각각 0, 1, 2, 3으로 표현해 계산에 편의를 둔다.

명령어가 MOVE일 때는 현재 방향을 고려하여 움직여야 한다.
현재 방향이 동쪽이면 인수만큼 +x, 서쪽이면 인수만큼 -x,
북쪽이면 인수만큼 +y, 남쪽이면 인수만큼 -y한다.

  • MOVE 명령어 수행마다 로봇의 위치가 벗어나는지 체크해준다.

시간복잡도

n개의 명령어에 대해 수행 -> O(n)O(n)
1 \leq n \leq 1,000 이므로 시간 내에 통과 가능

2. 코드 설계하기

분기문을 체계적으로 작성해야 함.

  1. input 받기
  2. 초기 방향, 위치 설정
  3. n회동안 명령어 계산 수행
    • TURN일 때
      • 인수가 0 -> 반시계 회전
      • 인수가 1 -> 시계 회전
    • MOVE일 때
      • 방향이 0 -> +x
      • 방향이 1 -> +y
      • 방향이 2 -> -x
      • 방향이 3 -> -y
      • 정사각형 밖으로 나감 -> break

3. 시도 회차 수정 사항

1회차) 성공 ~ easy

4. 정답 코드

import sys
input = sys.stdin.readline

m, n = map(int, input().split())
x, y = 0, 0
direction = 0

for _ in range(n):
    command, num = input().split()
    if command == "TURN":                               # TURN
        if num == "0":  direction = (direction + 1) % 4
        else:           direction = (direction + 3) % 4
    else:                                               # MOVE
        if direction == 0:      x += int(num)           # 동
        elif direction == 1:    y += int(num)           # 북
        elif direction == 2:    x -= int(num)           # 서
        else:                   y -= int(num)           # 남
        
        if not (0 <= x <= m and 0 <= y <= m):
            print(-1)
            break
else: print(x, y)

실버 4 쉬웠다 그리고 그래프나 DP보단 구현이 훨씬 재미있는 듯

5. 해설지 참고 후

  • 음수에 대한 나머지 연산도 양수값으로 잘 나옴
  • dx, dy 배열로 방향에 따른 이동 제어가 한번에 가능
profile
춤추는감자

0개의 댓글

관련 채용 정보