ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 1004] 어린 왕자
    PS/C++ 2024. 7. 5.

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

     

    원의방정식을 이용해 시작점 및 도착점이 원의 내부인지 외부인지 판별하는 문제이다.

     

    시작점 및 도착점이 모두 한 원 안에 있는 경우만 조심하면 된다.

     

    원의 정의는 어느 한 점으로부터 거리가 같은 점들의 집합이며  기본적인 원의 방정식은 피타고라스 정리에 의해

    x² + y² = r²

    로 표현할 수 있다.

     

    문제에서 중심의 좌표가 주어지니 x, y좌표를 그대로 이동하면 된다.

     

    그러면 식이

    (x - x1)² + (y - y1)² = r²

    처럼 될 것이며, 여기서 x, y가 원의 기준점으로 생각하고 x1, y1은 시작/도착점으로 계산하면 된다.

     

    그러면 아래 식을 만족하면 주어진 점이 해당 원 내부에 있는지, 외부에 있는지 체크할 수 있다

    (x - x1)² + (y - y1)² < r²

     

    시작점 또는 도착점 중 하나만 만족하는 경우(a ^ b)에만 정답에 1씩 더한다

    #include <bits/stdc++.h>
    #define FASTIO ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    using namespace std;
    bool get_inner(int cx, int cy, int r, int tx, int ty);
    int main() {
        FASTIO
        int T; cin >> T;
        while(T-->0) {
            int sx, sy, ex, ey;
            cin >> sx >> sy >> ex >> ey;
            int n; cin >> n;
            int res = 0;
            for(int i = 0; i < n; i++) {
                int cx, cy, r;
                cin >> cx >> cy >> r;
                bool gs = get_inner(cx, cy, r, sx, sy);
                bool ge = get_inner(cx, cy, r, ex, ey);
                res += gs ^ ge ? 1 : 0;
            }
            cout << res << '\n';
        }
    }
    bool get_inner(int cx, int cy, int r, int tx, int ty) {
        return (cx - tx) * (cx - tx) + (cy - ty) * (cy - ty) < r * r;
    }

     

    'PS > C++' 카테고리의 다른 글

    [백준 2529] 부등호  (0) 2024.07.18
    [백준 2470] 두 용액( + 2467번)  (0) 2024.07.10
    [백준 1707] 이분 그래프  (0) 2024.07.04
    [백준 9375] 패션왕 신해빈  (0) 2024.07.02
    [백준 2108] 통계학  (1) 2024.06.25

    댓글

Designed by Tistory.