Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 풀어보는 로봇 시뮬레이션: 원점에서의 최대 유클리드 거리 구하기

무한한 격자(grid) 위에 한 대의 로봇이 있다고 가정해 봅시다. 로봇은 좌표 (0, 0)에서 출발하며 처음에는 북쪽(위쪽)을 바라보고 있습니다. 이 로봇은 다음과 같은 세 종류의 명령을 받을 수 있습니다.

  1. -2: 왼쪽으로 90도 회전
  2. -1: 오른쪽으로 90도 회전
  3. 1부터 9 사이의 값: 해당 값만큼 앞으로 전진

또한 obstacles(장애물) 배열이 주어집니다. i번째 장애물은 격자점 (obstacles[i][0], obstacles[i][1])에 위치하며, 로봇이 해당 지점으로 이동하려고 하면 실제로는 그 자리에 머무르지 못하고 이전 위치에 그대로 멈추게 됩니다.

우리가 구해야 할 것은 로봇이 원점에서 가질 수 있는 유클리드 거리(Euclidean distance)의 제곱 중 최댓값입니다.

예시

입력이 commands = [4, -1, 4, -2, 4]이고, obstacles = [[2, 4]]라고 해봅시다. 로봇은 (1, 4) 지점에서 장애물에 막혀 더 이상 전진하지 못하고, 왼쪽으로 회전한 후 (5, 4) 방향이 아닌 위쪽 방향으로 이동하여 결과적으로 출력값은 65가 됩니다.

해결 접근 방식

이 문제를 해결하기 위해 다음 단계를 따릅니다.

  • 방향별 이동 오프셋을 정의합니다: position_offset = [(0, 1), (1, 0), (0, -1), (-1, 0)] — 각각 북, 동, 남, 서를 의미합니다.
  • x, y, direction(방향), max_distance(최대 거리) 변수를 모두 0으로 초기화합니다.
  • commands의 각 명령에 대해 반복 처리합니다.
    • 명령이 -2이면: direction := (direction - 1) mod 4 → 왼쪽 회전
    • 명령이 -1이면: direction := (direction + 1) mod 4 → 오른쪽 회전
    • 그 외의 경우: 현재 방향에 맞는 오프셋 (x_off, y_off) := position_offset[direction]을 가져옵니다.
  • command 값이 0이 될 때까지 반복하면서 한 칸씩 전진을 시도합니다. 다음 위치 (x + x_off, y + y_off)가 장애물 목록에 없다면 실제로 이동하고, command를 1씩 감소시킵니다.
  • 매 단계마다 max_distance를 max_distance와 x² + y² 중 큰 값으로 갱신합니다.

마지막으로 max_distance를 반환하면 됩니다.

구현 예제 코드

class Solution:
   def robotSim(self, commands, obstacles):
      position_offset = [(0, 1), (1, 0), (0, -1), (-1, 0)]
      obstacles = set(map(tuple, obstacles))
      x, y, direction, max_distance = 0, 0, 0, 0
      for command in commands:
         if command == -2: direction = (direction - 1) % 4
         elif command == -1: direction = (direction + 1) % 4
         else:
            x_off, y_off = position_offset[direction]
            while command:
               if (x + x_off, y + y_off) not in obstacles:
                  x += x_off
                  y += y_off
               command -= 1
            max_distance = max(max_distance, x**2 + y**2)
      return max_distance

ob = Solution()
print(ob.robotSim([4,-1,4,-2,4],[[2,4]]))

입력

[4,-1,4,-2,4],[[2,4]]

출력

65

핵심 포인트 정리

  • 방향 관리: 나머지 연산(mod 4)을 활용하면 회전 로직을 간단하게 처리할 수 있습니다.
  • 장애물 조회 성능: obstacles 리스트를 set(집합)으로 변환하면 O(1) 시간 복잡도로 장애물 여부를 확인할 수 있어 전체 알고리즘의 효율이 크게 향상됩니다.
  • 거리 계산: 유클리드 거리 자체가 아닌 거리의 제곱(x² + y²)을 비교하기 때문에 불필요한 제곱근 연산 없이 정수 연산만으로 정확한 답을 얻을 수 있습니다.