문제 출처: https://www.acmicpc.net/problem/1358
Sol)
#include <stdio.h>
#include <math.h>
int main(){
int width, height, x, y, player_num;
int radius, player_x, player_y, cnt = 0;
scanf("%d %d %d %d %d", &width, &height, &x, &y, &player_num);
radius = height / 2;
while(player_num--){
scanf("%d %d", &player_x, &player_y);
if(player_y >= y && player_y <= y + height){ //y범위를 넘어가면 어떤 경우에도 링크 안에 들어올 수 없다.
if(player_x >= x && player_x <= x + width) //직사각형 안에 있으면
cnt++;
else if(player_x >= x - radius && player_x <= x){
if(pow(player_x - x, 2) + pow(player_y - (y + radius), 2) <= pow(radius, 2)) //왼쪽 반원 안에 있으면
cnt++;
}
else if(player_x >= x + width && player_x <= x + width + radius){
if(pow(player_x - (x + width), 2) + pow(player_y - (y + radius), 2) <= pow(radius, 2)) //오른쪽 반원 안에 있으면
cnt++;
}
}
}
printf("%d\n", cnt);
return 0;
}
- 풀이 방향
하키 링크장 안에 있는 선수들의 수를 주어진 좌표를 이용해 세는 문제이다. 직사각형 안에 있는 선수들 + 양쪽 반 원 안에 있는 선수들을 세면 되므로 주어진 좌표에 맞게 원의 방정식만 만들면 풀 수 있을 것이다.
- 풀이
먼저, 주어진 y좌표의 범위를 넘어가는 위치에 있는 선수들은 x좌표에 상관없이 링크장 안에 들어올 수 없으므로 y좌표 범위를 충족시키는지 여부를 가장 먼저 체크한다. 그 후, x좌표와 직사각형의 가로길이를 이용해 직사각형 안에 있는지 체크, 원의 방정식을 세워 선수의 좌표가 해당 원의 방정식을 만족시키는지 각각 체크해 준다.
- 문제에 대한 사견
시간에 대한 압박도 없었고, 결국 식만 잘 세우면 되는 문제였다.
'BOJ' 카테고리의 다른 글
백준 3273번 두 수의 합 [C언어] (2) | 2022.09.02 |
---|---|
백준 11718번 그대로 출력하기 [C언어] (0) | 2022.08.30 |
백준 1934번 최소공배수 [C언어] (0) | 2022.08.29 |
백준 3053번 택시 기하학 [C언어] (0) | 2022.08.29 |
백준 2420번 사파리 월드 [C언어] (0) | 2022.08.28 |