16085번 Гэмт хэрэг

문제


img01

16085번 Гэмт хэрэг - 백준

번역


형사가 용의자가 있을 수 있는 지역의 넓이를 계산하는 문제.

정보가 들어온지 T초가 지났다.
차량은 오직 도로 위로만 이동하며 도로는 단 하나 존재한다.(x축)
도보로는 도로를 벗어날 수 있다.(y축)
도보로는 초당 W미터, 차를 타면 초당 C 미터 이동 가능하다.
탑승, 하차 시간은 계산하지 않음.

설계


단순히 원형, 캡슐형을 생각해서 계산하니 예제에 맞지 않는다.
우선 분기해야하는 부분이 C와 W 속도 차이.
차량보다 도보가 빠르면 차량을 탈 이유가 없다.
따라서 W가 C보다 크거나 같을 경우 도보로 가능한 원의 너비를 계산하면 끝.

C가 W보다 큰게 문제인데
우선 도로를 타고 차량을 타고 이동한다.
거기서 내린 뒤 남은 시간동안 도보로 이동할 수 있다.

도보로 이동하는 거리는 차량을 쓰는 만큼 줄어든다.
0 <= x <= T * C 만큼 차를 타고 이동하면 남은 시간은 T - x / C 이며
보행반경이 W * (T - x / C) 만큼 줄어든다.

순수 도보로 그려지는 원의 경계가 더 큰 동안 원의 경계를 따르고
이후 차량->도보로 그려지는 선형구간의 넓이를 추가한다.

도보 원의 세그먼트 면적과 차량->도보로 이어지는 선형구간을 합하고 양쪽으로 갈 수 있으니 2를 곱해서 나오는 공식은
2 * T^2 * (W^2 * arcsin(W/C) + W * sqrt(C^2 - W^2))

아 머리아파

구현


#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;

int main() {

    int n;
    cin >> n;

    while (n--) {
        double T, W, C;
        cin >> T >> W >> C;
        double result;


        if (C <= W) {
            // 도보가 빠르면 원 면적 계산
            // (W*T)^2 * π
            result = W * W * T * T * M_PI;
        } else {
            // 차량이 빠르면 공식에 대입
            // 2 * T^2 * (W^2 * arcsin(W/C) + W * sqrt(C^2 - W^2))
            double term1 = W * W * asin(W / C); // W^2 * arcsin(W/C)
            double term2 = W * sqrt(C * C - W * W); // W * sqrt(C^2 - W^2)
            result = 2.0 * T * T * (term1 + term2);
        }

        // 소수점 셋째 자리까지 출력
        printf("%.3f\n", result);
    }
    
    return 0;
}

채점


img02

반성


이딴게 왜 골드? 하고 접근했다가
예제 다틀려서 상당히 당황했다.

세상만사 다 이유가 있지…

코드 확인


Link to GitHub

Updated: