본문 바로가기
알고리즘

[BOJ] 백준 1004번: 어린 왕자

by 강성주의 알고리즘 2020. 8. 11.

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

 

1004번: 어린 왕자

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 첫째 줄에 출발점 (x1, y1)과 도착점 (x2, y2)이 주어진다. 두 번째 줄에는 행성계의 개수 n이 주��

www.acmicpc.net

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

점과 원사이 관계로 푸는 문제.

출발 지점과 도착 지점이 주어진 원에 대하여 두 점이 모두 원 안쪽에 속하는지, 둘다 속하지 않은 경우 해당 원을 진입하거나 이탈 할 필요가 없습니다.

어느 한 지점만 속한 경우 반드시 진입 또는 이탈을 해야하므로 이 경우에만 1 증가 시켜주면 됩니다.

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	int t;
	cin >> t;
	for (; t--;) {
		int sx, sy, dx, dy;
		int n;
		int ans = 0;
		cin >> sx >> sy >> dx >> dy >> n;
		
		for (int i = 0; i < n; i++) {
			int x, y, r;
			cin >> x >> y >> r;
			int cnt = 0;
			int dist = (sx - x) * (sx - x) + (sy - y) * (sy - y);
			if (dist <= r * r) {
				cnt += 1;
			}
			dist = (dx - x) * (dx - x) + (dy - y) * (dy - y);
			if (dist <= r * r) {
				cnt += 1;
			}
			if (cnt == 1) { // 출발 또는 도착 지점 중 한점만 원에 속함
				ans += 1;
			}

		}
		cout << ans << "\n";
	}
}

 

반응형