공부/알고리즘(PS)

BOJ1069 집으로

ayuriK152 2025. 10. 4. 16:57
 

아이디어


사실 접근 자체는 어렵지 않았다. 일단 원점부터 주어진 좌표까지의 거리를 double로 저장해두고 최대한 점프로 거리를 좁힌 후에 특정 범위에 다다랐을 때 조건분기로 걸린 시간을 구해내겠다는, 단순하지만 해답에 거의 가까운 발상이였다. 조건분기로는 세 가지 경우를 고려했다.

  1. 점프 두 번
  2. 점프 한 번 + 걸어서
  3. 그냥 걸어서

하지만 이걸 조건문으로 돌리려니 어떻게 조건을 걸어야할지 참 막막했고 그냥 MIN을 써서 최소값을 구하는 방식으로 구현했다. 그리고 빼먹은 경우가 있었는데 바로 점프를 어떻게 사용하던 애초에 걷는 속도보다 느린 경우다. 이걸 나중에 알아내서 조건을 추가해줬다.

해답


#include <bits/stdc++.h>
using namespace std;

int main() {
    double answer = 0;

    int x, y, d, t;
    cin >> x >> y >> d >> t;

    double remain = sqrt(x * x + y * y);
    if ((double)d / t < 1.0)
        answer = remain;
    else {
        while (true) {
            if (abs(remain) < d * 2) {
                answer += min(min((double)t * 2, abs(remain)), t + abs(remain - d));
                break;
            }
            remain -= d;
            answer += t;
        }
    }

    cout.precision(12);
    cout << fixed << answer;

    return 0;
}