Algorithm/PS
[1일 1알고] 32574 손이 닿는 범위
Basaeng
2026. 3. 21. 11:34
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사이의 나눗셈이 되어 자동으로 소수점이 버려지기 때문에 원하는 답과 다른 답이 나올 수 있다는 것입니다.
hypot, hypotf, hypotl, _hypot, _hypotf, _hypotl
hypot, hypotf, hypotl, _hypot, _hypotf 및 _hypotl;에 대한 API 참조 는 hypotenuse를 계산합니다.
learn.microsoft.com
삼각형의 빗변거리를 구하는 것에는 hypot계열 함수를 사용했습니다.
직접 구해도 충분히 답이 될 것으로 보입니다.