무한한 격자(grid) 위에 한 대의 로봇이 있다고 가정해 봅시다. 로봇은 좌표 (0, 0)에서 출발하며 처음에는 북쪽(위쪽)을 바라보고 있습니다. 이 로봇은 다음과 같은 세 종류의 명령을 받을 수 있습니다.
- -2: 왼쪽으로 90도 회전
- -1: 오른쪽으로 90도 회전
- 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²)을 비교하기 때문에 불필요한 제곱근 연산 없이 정수 연산만으로 정확한 답을 얻을 수 있습니다.