주어진 점이 주어진 영역 내에 존재하는지 확인하는 문제.
한 번에 성공함.
3가지 경우로 나누어서 풀 수 있다.
2번은 직사각형의 최대-최솟점을 이용하면 되며, 1번과 3번은 원점의 좌표와 주어진 점의 좌표의 대소관계를 먼저 확인한 후 주어진 범위 내에 점이 존재하는지 보면 된다.
코드로 옮겨보자.
#include <stdio.h>
int X, Y, W, H, P, C=0;
int main() {
scanf("%d%d%d%d%d", &W, &H, &X, &Y, &P);
for(int i = 0; i < P; i++) {
int x, y;
scanf("%d%d", &x, &y);
if(x < X) {
if((x-X)*(x-X)+(Y+H/2-y)*(Y+H/2-y)<=(H/2)*(H/2)) C++;
} else if(X <= x && x <= X+W) {
if(Y <= y && y <= Y+H) C++;
} else {
if((X+W-x)*(X+W-x)+(Y+H/2-y)*(Y+H/2-y)<=(H/2)*(H/2)) C++;
}
}
printf("%d", C);
}
원의 반지름은 원 위의 점과 원점 사이의 거리인데, 한 꼭짓점이 원점이며, 다른 한 변이 축 위에 있는 삼각형의 빗변의 길이와도 동일하다.
<math.h>
에는 그 빗변의 길이를 구하는 hypot()
이라는 함수가 있다. 이를 이용한 풀이가 있었다. 사실상 숏코딩용이긴 한데 발상의 전환이 필요할 때 도움이 될 듯 싶다.
#include <stdio.h>
#include <math.h>
int main(){
int w,h,x,y,p;
int i,px,py;
int pl=0;
double c;
scanf("%d%d%d%d%d",&w,&h,&x,&y,&p);
for(i=0; i<p; i++){
scanf("%d%d",&px,&py);
if(px>=x&&px<=x+w&&py>=y&&py<=y+h)
pl++;
else if(hypot(px-x,py-(y+h/2))<=h/2)
pl++;
else if(hypot(px-(x+w),py-(y+h/2))<=h/2)
pl++;
}
printf("%d",pl);
}
-> chojl1125님의 풀이