궤도

[EPPER] 9회 6번 본문

💻 현생/⛓ 알고리즘

[EPPER] 9회 6번

영이오 2020. 10. 7. 21:41

문제

 

 

 


풀이

 

C의 좌표와 반지름 r을 입력받고 적함대의 수만큼 그 정보를 배열에 저장한다.

그리고 각각의 적함대에 대해 dist함수를 호출해 길이를 구하는데, 다들 알겠지만 두 좌표의 거리를 구할 때는 마지막에 루트를 씌워야한다. 하지만 그렇게 하지 않고 제곱한 상태로 가져왔는데, 루트를 씌우는 과정에서 값이 손실돼 답이 달라질 수도 있기 때문이다.

거리를 제곱해서 가져왔으니 r도 당연히 제곱한 상태로 비교한다. 그리고 범위 안에 들어왔다면 cnt를 증가해서 최종 출력한다.


소스코드

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>

int dist(int ax, int ay, int bx, int by) { //길이 구함. 루트 씌우면 숫자 달라지니까 그냥 제곱으로 가져옴
	int dist_x = abs(ax - bx);
	int dist_y = abs(ay - by);

	return (dist_x * dist_x) + (dist_y * dist_y);
}

int main() {
	int cx, cy, r, n;
	int ex[50], ey[50];
	int cnt = 0;

	scanf("%d %d %d %d", &cx, &cy, &r, &n);
	for (int i = 0; i < n; i++)
		scanf("%d %d", &ex[i], &ey[i]);
	for (int i = 0; i < n; i++) {
		if (dist(cx, cy, ex[i], ey[i]) <= (r * r)) //범위 안에 들어오면 카운트 증가
			cnt++;
	}
	printf("%d", cnt);
}
Comments