1358번 : 하키
지난주에, 민식주식회사는 IIHF(International Ice Hockey Federation)로부터 긴급한 전화를 받았다.
IIHF는 같은 팀이 링크안에 너무 많으면 알람이 울리는 시스템을 설치해달라고 요청했다. 시스템은 다음과 같이 3개의 부분으로 이루어진다.
- 디지털카메라가 링크의 사진을 매 1초마다 찍는다.
- 디지털카메라가 찍은 사진에서 각 선수의 위치를 뽑아낸다.
- 하키 링크 안에 같은 팀 선수가 총 몇 명인지 계산한다.
하키 링크는 (X, Y)가 가장 왼쪽 아래 모서리인 W * H 크기의 직사각형과, 반지름이 H/2이면서 중심이 (X, Y+R), (X+W, Y+R)에 있는 두 개의 원으로 이루어져 있다. 아래 그림을 참고한다.
선수들의 위치가 주어질 때, 링크 안 또는 경계에 있는 선수가 총 몇 명인지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 수 W H X Y P가 주어진다. P는 선수의 수이다. W와 H는 100보다 작거나 같은 자연수이고, H는 짝수이다. X와 Y는 절댓값이 100보다 작거나 같은 정수이다. P는 최대 50인 자연수이다. 둘째 줄부터 P개의 줄에 각 선수들의 x좌표와 y좌표가 주어진다. 이 좌표는 절댓값이 300보다 작거나 같은 정수이다.
출력
첫째 줄에 링크 안에 있는 선수의 수를 출력한다.
생각해 볼 점
원과 사각형 지점으로 영역을 분리한 후
1. 사각형 내부에 있을 경우
선수의 좌표 : x, y가 사각형 좌표 이내에 있는지 확인합니다.
2. 원형 공간 내부에 있는 경우
선수의 좌표와 원의 중심의 거리가 원의 반지름보다 작거나 같으면 내부에 있다고 판정합니다.
코드
#include <iostream>
inline bool isInCircle(int dist_x, int dist_y,int R)
{
return (dist_x * dist_x + dist_y * dist_y) <= R * R;
}
int main()
{
int W, H, X, Y, P;
scanf("%d %d %d %d %d", &W, &H, &X, &Y, &P);
int ans = 0;
int R = H >> 1;
int R_sq = R * R;
for (int i = 0; i < P; i++)
{
int in_x, in_y;
scanf("%d %d", &in_x, &in_y);
//사각형 판정
if (X <= in_x && in_x <= X + W && Y <= in_y && in_y <= Y + H)
ans++;
//원 판정
else if (in_x < X && isInCircle((X - in_x), (Y + R - in_y), R))
ans++;
else if (X + W < in_x && isInCircle((X + W - in_x), (Y + R - in_y), R))
ans++;
}
printf("%d", ans);
return 0;
}
그 외
'공부 및 정리 > 백준 코드' 카테고리의 다른 글
[C++]백준 - 2407번 문제 (0) | 2022.10.08 |
---|---|
[C++]백준 - 14500번 문제 (0) | 2022.10.07 |
[C++]백준 - 10815번 문제 (0) | 2022.07.26 |
[C++]백준 - 1790번 문제 (0) | 2022.07.25 |
[C++]백준 - 1064번 문제 (0) | 2022.05.19 |