1358: 하키

네르기·2022년 9월 13일
0

알고리즘

목록 보기
71/76

어떤 문제인가?

주어진 점이 주어진 영역 내에 존재하는지 확인하는 문제.

시행착오 횟수

한 번에 성공함.

1차 시도: AC

3가지 경우로 나누어서 풀 수 있다.

  1. 왼쪽 반원에 위치하는 경우
  2. 직사각형에 위치하는 경우
  3. 우측 반원에 위치하는 경우

2번은 직사각형의 최대-최솟점을 이용하면 되며, 1번과 3번은 원점의 xx 좌표와 주어진 점의 xx 좌표의 대소관계를 먼저 확인한 후 주어진 범위 내에 점이 존재하는지 보면 된다.

코드로 옮겨보자.

#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님의 풀이

profile
프로그래머와 애니메이터가 되고파

0개의 댓글