본문 바로가기

Algorithm/PS

[1일 1알고] 32574 손이 닿는 범위

https://www.acmicpc.net/problem/32754

 

 


해당 문제는 간단한 거리 계산 문제입니다.

다행히도 2차원 도형문제이기 때문에 크게 생각할 것은 없었습니다.

 

먼저 직사각형이기 때문에 무게중심은 각 꼭짓점을 더한 것의 4분의 1에 위치할 것입니다.

그리고 원점에서 가장 가까운 거리를 가지도록 회전하기 위해서는 무게중심에서 가장 먼 위치인 대각 꼭짓점이 원점의 기울기에 맞게 회전해야할 것입니다.

 

무게중심 간 기울기와, 가장 가까운 거리의 점까지의 기울기가 같기 때문에 결론적으로 원점에서 가장 가까운 거리는 무게중심까지의 거리와 무게중심에서 꼭짓점 까지의 거리의 차이입니다.


int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, R;
    cin >> N >> R;
    int result = 0;
    for (int i = 0; i < N; ++i)
    {
        int x1, y1, x2, y2, x3, y3, x4, y4;
        cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4;

        double cx = (x1 + x2 + x3 + x4) / 4.0;
        double cy = (y1 + y2 + y3 + y4) / 4.0;

        double r1 = hypotl(cx, cy);
        double r2 = hypotl(cx - x1, cy - y1);
        if (R >= r1 - r2)
            ++result;
    }

    cout << result;

    return 0;
}

결론적으로 위와 같은 코드가 나옵니다.

 

여기서 주의할 점이 있다면, double로의 연산 cx, cy를 할 때 int끼리 연산하면 안된다는 점입니다.

 

만약에 나눗셈이 4.0(f)이 아니라 4라면, int와 int사이의 나눗셈이 되어 자동으로 소수점이 버려지기 때문에 원하는 답과 다른 답이 나올 수 있다는 것입니다.

 

https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/hypot-hypotf-hypotl-hypot-hypotf-hypotl?view=msvc-170

 

hypot, hypotf, hypotl, _hypot, _hypotf, _hypotl

hypot, hypotf, hypotl, _hypot, _hypotf 및 _hypotl;에 대한 API 참조 는 hypotenuse를 계산합니다.

learn.microsoft.com

삼각형의 빗변거리를 구하는 것에는 hypot계열 함수를 사용했습니다.

직접 구해도 충분히 답이 될 것으로 보입니다.