Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 로봇의 최소 이동 횟수 계산하기

두 개의 좌표 (x1, y1)과 (x2, y2)가 있다고 가정해 봅시다. 로봇은 현재 (x1, y1) 지점에 있으며, (x2, y2) 지점으로 이동하려고 합니다. 로봇은 한 번의 스텝(step)마다 인접한 8개의 칸 중 한 곳으로 이동할 수 있습니다(상, 하, 좌, 우 및 대각선 방향 포함). 우리가 구해야 할 것은 최종 위치에 도달하기 위해 필요한 최소 이동 횟수입니다.

문제 예시

예를 들어 입력이 다음과 같다고 해 보겠습니다.

x1 = 3; y1 = 4; x2 = 6; y2 = 1;

이 경우 출력은 3이 됩니다. 아래 그림처럼 대각선 방향을 활용하면 단 3번의 이동만으로 목적지에 도달할 수 있기 때문입니다.

C++로 로봇의 최소 이동 횟수 계산하기

풀이 아이디어

핵심은 로봇이 대각선으로도 이동할 수 있다는 점입니다. 대각선 이동 한 번으로 X축 거리와 Y축 거리를 동시에 1씩 줄일 수 있으므로, 필요한 최소 스텝 수는 두 축 방향 거리 차이 중 더 큰 값과 같습니다. 이는 체비셰프 거리(Chebyshev Distance)라고도 불립니다.

따라서 풀이 절차는 다음과 같습니다.

  • X축 방향 거리 차이 |x2 − x1|를 계산합니다.
  • Y축 방향 거리 차이 |y2 − y1|를 계산합니다.
  • 두 값 중 최댓값(maximum)을 반환합니다.
return max(|x2 - x1|, |y2 - y1|);

C++ 구현 예제

아래 코드를 통해 실제 구현 방법을 확인해 보겠습니다.

#include <bits/stdc++.h>
using namespace std;
int solve(int x1, int y1, int x2, int y2){
   return max(abs(x2 - x1), abs(y2 - y1));
}
int main(){
   int x1 = 3;
   int y1 = 4;
   int x2 = 6;
   int y2 = 1;
   cout << solve(x1, y1, x2, y2) << endl;
}

입력

3, 4, 6, 1

출력

3

복잡도 분석

이 풀이는 단순히 두 값의 절댓값 차이를 계산하고 최댓값을 반환하기만 하면 되므로, 시간 복잡도는 O(1)입니다. 추가적인 메모리 사용 없이 상수 시간 안에 답을 구할 수 있는 매우 효율적인 알고리즘입니다.