ABOUT ME

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

    난이도: Bronze I

     

    태그

    더보기
    • Geometry

     

    풀이

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

    더보기

    직사각형의 좌측 하단 점을 (x1,y1), 우측 상단 점을 (x2,y2)라고 합시다.

     

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

    x좌표는 x1 이상 x2 이하여야 하고, y좌표는 y1 이상 y2 이하여야 합니다.

     

    식으로 쓰자면, x1xx2, y1yy2가 됩니다.

     

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

    더보기

    원의 중심을 (x1,y1), 반지름을 r이라고 합시다.

     

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

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

     

    식으로 쓰자면, (x1x)2+(y1y)2r이 됩니다.

     

    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.