-
[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. 코드
더보기실수 오차를 피하기 위해, 원 내부를 판별할 때에는 식의 양변을 제곱했습니다.
1234567891011121314151617181920212223242526272829vector<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*y + x*x <= r*r){ ans += 1; }}cout << ans << endl;}}cs '문제 풀이 > Baekjoon Online Judge' 카테고리의 다른 글
[Baekjoon - 25449] Eurokulen (0) 2023.03.03 [Baekjoon - 2049] 가장 먼 두 점 (0) 2023.03.02 [Baekjoon - 15850] Random Number Generator (0) 2023.03.01 [Baekjoon - 12996] Acka (0) 2023.03.01 [Baekjoon - 2144] 울타리 넘기 (0) 2023.03.01