※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1358번 문제인 하키이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1358
1358번: 하키
첫째 줄에 수 W H X Y P가 주어진다. P는 선수의 수이다. W와 H는 100보다 작거나 같은 자연수이고, H는 짝수이다. X와 Y는 절댓값이 100보다 작거나 같은 정수이다. P는 최대 50인 자연수이다. 둘째 줄부
www.acmicpc.net
선수의 좌표가 경기장 안에 있는지 확인하는 것은 선수의 좌표가 다음 중 적어도 하나를 만족하는지를 확인하는 것으로 해낼 수 있다는 점을 관찰하자.
(1) 선수의 좌표가 경기장의 직사각형 영역 내부에 있다.
(2) 선수의 좌표가 왼쪽 반원 영역 내부에 있다.
(3) 선수의 좌표가 오른쪽 반원 영역 내부에 있다.
특히 각 반원영역의 나머지 절반은 항상 경기장의 다른 부분에 포함되므로 반원의 내부에 있는지를 판단하기 위해 x좌표를 따질 일 없이 단순히 원의 내부에 있는지를 판단하는 코드를 작성하는 것으로 문제를 간단히 해결할 수 있다.
주어진 좌표를 전부 2배로 늘려 계산하면 실수 자료형 없이 모든 계산을 정수로 해낼 수 있다. 특히, 거리의 경우 거리의 제곱값으로 비교를 하면 실수의 비교를 피할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int ans = 0;
int W, H, X, Y, P;
int distsq(int X1, int Y1, int X2, int Y2) {
return (X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> W >> H >> X >> Y >> P;
W *= 2, H *= 2, X *= 2, Y *= 2;
while (P--) {
int x, y; cin >> x >> y; x *= 2, y *= 2;
if (distsq(x, y, X, Y + H / 2) <= H * H / 4 || distsq(x, y, X + W, Y + H / 2) <= H * H / 4 || (X <= x && x <= X + W && Y <= y && y <= Y + H)) ans++;
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 16397 // C++] 탈출 (0) | 2023.03.12 |
---|---|
[BOJ 27659 // C++] Queue skipping (Easy) (0) | 2023.03.11 |
[BOJ 27660 // C++] Queue skipping (Hard) (0) | 2023.03.11 |
[BOJ 4883 // C++] 삼각 그래프 (0) | 2023.03.10 |
[BOJ 2618 // C++] 경찰차 (0) | 2023.03.10 |