ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Baekjoon - 10497] Hitting the Targets
    문제 풀이/Baekjoon Online Judge 2023. 3. 2. 08:18

    난이도: Bronze I

     

    태그

    더보기
    • Geometry

     

    풀이

    1. 점이 직사각형 안에 있는지 확인하는 방법은?

    더보기

    직사각형의 좌측 하단 점을 \( (x_1, y_1) \), 우측 상단 점을 \( (x_2, y_2) \)라고 합시다.

     

    우리가 입력받은 점이 \( (x, y) \)라면, 점이 직사각형 안에 있기 위해서는

    \( x \)좌표는 \( x_1 \) 이상 \( x_2 \) 이하여야 하고, \( y \)좌표는 \( y_1 \) 이상 \( y_2 \) 이하여야 합니다.

     

    식으로 쓰자면, \( x_1 \le x \le x_2 \), \( y_1 \le y \le y_2 \)가 됩니다.

     

    2. 점이 원 안에 있는지 확인하는 방법은?

    더보기

    원의 중심을 \( (x_1, y_1) \), 반지름을 \( r \)이라고 합시다.

     

    우리가 입력받은 점이 \( (x, y) \)라면, 점이 원 안에 있기 위해서는

    중심과 점 사이의 거리가 \( r \) 이하여야 합니다.

     

    식으로 쓰자면, \( \sqrt{(x_1-x)^2 + (y_1-y)^2} \le r \)이 됩니다.

     

    3. 코드

    더보기

    실수 오차를 피하기 위해, 원 내부를 판별할 때에는 식의 양변을 제곱했습니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    vector<pi4> rec; vector<pi3> cir;
     
    void Main(){
        int n; cin >> n; while (n--){
            string typ; cin >> typ;
            if (typ[0== 'r'){
                pi4 p; cin >> p.fr.fr >> p.fr.sc >> p.sc.fr >> p.sc.sc;
                rec.push_back(p);
            }
            if (typ[0== 'c'){
                pi3 p; cin >> p.fr.fr >> p.fr.sc >> p.sc;
                cir.push_back(p);
            }
        }
        int q; cin >> q; while (q--){
            pi2 p; cin >> p.fr >> p.sc;
            int ans = 0;
            for (pi4 r : rec){
                if (r.fr.fr <= p.fr && p.fr <= r.sc.fr
                 && r.fr.sc <= p.sc && p.sc <= r.sc.sc){ ans += 1; }
            }
            for (pi3 c : cir){
                int y = p.fr - c.fr.fr, x = p.sc - c.fr.sc;
                int r = c.sc;
                if (y*+ x*<= r*r){ ans += 1; }
            }
            cout << ans << endl;
        }
    }
    cs
Designed by Tistory.