백준 1069번 문제 바로가기

문제에 대한 첫 인상

이 문제는 처음 접했을 땐, 이게 골드 문제?! 싶었지만, 문제를 찬찬히 살펴보니 생각보다 고려할게 많았다. 처음엔 “택시 거리”처럼 축을 따라서만 이동할 수 있는줄 알았지만, 그런 제약을 없었다는 것! 따라서 이동할 수 있는 경우의 수는 총 4가지가 있다.

  1. 대각선을 따라서 그냥 걸어오는 경우
  2. 대각선을 따라 직전까지 뛰고 나머지를 걸어오는 경우
  3. 대각선을 따라 한번 저 뛰고 차이만큼 걸어서 돌아오는 경우
  4. 점프만 이용해서 돌아돌아 오는 경우 (활 꼴 그리는 느낌으로)
    • 이 경우 3번의 점프 횟수 만큼 점프해야 한다.

위의 4가지 경우에 맞게 구현해주고 min값을 구해주면 답을 얻어낼 수 있다. 오차를 $ 10^{-9} $ 로 맞춰주라 했기 때문에 cout.precision(16) 정도로 넉넉하게 잡아주면 된다.

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int X, Y, D, T;
    cin >> X >> Y >> D >> T;
    
    double distance = sqrt(pow(X, 2) + pow(Y, 2)); // 대각선 길이
    
    double ans = 0;
    int n_jump = 0;
    while (n_jump * D < distance){
        n_jump += 1;
    }
    
    double temp1 = distance - D*(n_jump-1) + T*(n_jump-1);
    double temp2 = abs(distance - D*n_jump) + T*n_jump;
    if (n_jump < 2){
        n_jump = 2;
    }
    double temp3 = T*n_jump;
    
    
    ans = min(distance, temp1);
    ans = min(ans, temp2);
    ans = min(ans, temp3);
    
    cout.precision(16);
    cout << ans;
    
    return 0;
}