본문 바로가기
Programming/BOJ

백준 #1004 어린왕자

by 작은별하나 2019. 12. 19.
반응형

어린왕자 문제는 원의 중심과 반지름을 가지고, 어떤 점을 포함하고 있는지 아닌지를 판별하는 문제입니다.

 

어린왕자의 우주선 경로

처음에 이 문제를 보았을 때에는 그림만 보면, 어린왕자의 우주선이 어떤 부피를 가지고 행성사이를 빠져나가는 모습을 상상했었는데, 전혀 그런것과 무관한 문제였습니다.  그림만 보고 어렵지 않을까 생각하고 나중에서야 푼 문제네요.

 

백준 문제의 링크는 다음과 같습니다.

https://www.acmicpc.net/problem/1004

 

1004번: 어린 왕자

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 첫째 줄에 출발점 (x1, y1)과 도착점 (x2, y2)이 주어진다. 두 번째 줄에는 행성계의 개수 n이 주어지며, 세 번째 줄부터 n줄에 걸쳐 행성계의 중점과 반지름 (cx, cy, r)이 주어진다. 입력제한은 다음과 같다. (-1000 ≤ x1, y1, x2, y2, cx, cy ≤ 1000, 1 ≤ r ≤ 1000, 1 ≤ n ≤ 50) 좌표와 반지름

www.acmicpc.net

 

처음에 썼듯이 이 문제는 좌표에 점이 주어졌으면, 그 점이 주어진 원들 안에 포함되는지 아닌지만 판단하면 되는 문제로 간단하게 풀면 됩니다.

 

모든 원에 대해서 어린왕자의 우주선 시작점이 포함되어 있거나 아니면 도착점이 포함되어 있거나 판단한 값을 각각 a, b 라고 한다면, a, b 의 상태가 서로 다를 때에만 카운팅해서 답을 적어내면 됩니다.

 

이에 대한 풀이는 다음과 같습니다.  소스는 참고용으로만 보세요.

 

//----------------------------------------------------------------------------------------
//	baekjoon #1004
//		- by Aubrey Choi
//		- created at 2019-09-14
//----------------------------------------------------------------------------------------
#include <stdio.h>

int main()
{
	int t, x1, y1, x2, y2, n;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&n);
		int ans=0, x, y, r;
		while(n--)
		{
			int t=0;
			scanf("%d%d%d",&x,&y,&r);
			if((x1-x)*(x1-x)+(y1-y)*(y1-y)<r*r) t++;
			if((x2-x)*(x2-x)+(y2-y)*(y2-y)<r*r) t++;
			ans += t==1;
		}
		printf("%d\n", ans);
	}
}
728x90

'Programming > BOJ' 카테고리의 다른 글

백준 #1009 분산처리  (0) 2019.12.20
#1007 벡터 매칭(Mathematics)  (0) 2019.12.20
[C/C++] 백준 #1005 ACM Craft(위상 정렬)  (0) 2019.12.19
백준 #1003 피보나치 함수  (0) 2019.12.16
[C/C++] 백준 #1002 터렛(수학)  (0) 2019.12.16

댓글