본문 바로가기
백준 문풀

1004

by 기록을안하면바보 2024. 7. 2.

어린 왕자

 

딱 봤을 때는 어려워 보였는데 조금 생각해보니까 풀 수 있었다.

 

시작 좌표와 끝 좌표가 속한 원의 개수를 세주었다.

만약 한 원에 시작 좌표와 끝 좌표가 둘 다 속해 있다면 그 원은 세지 않음. 이를 위해 집합을 사용해 주었다.

또한 집합에 행성의 x,y,r 좌표를 묶어서 저장해주려고 튜플을 이용주었다.

pair로는 두개까지만 묶인다더라..

 

좌표가 원 내부에 있는지 판단해야하는데 처음에 사각형의 내부로 판단해 틀렸었음.

#include<set>
#include<iostream>
#include<tuple>
#include<cmath>
using namespace std;

set<tuple<int, int, int>>P;
set<tuple<int, int, int>>via;

void planet(int a, int b, int r) {
	P.insert(make_tuple(a, b, r));
}

void search(int a, int b ,int c,int d) {
	for (auto i = P.begin();i != P.end();i++) {
		int x = get<0>(*i);
		int y = get<1>(*i);
		int r = get<2>(*i);
		if (pow(a - x, 2) + pow(b - y, 2) < pow(r, 2)) {
			if ( pow(c - x, 2) + pow(d - y, 2) < pow(r, 2)) {
				continue;
			}
			else {
				via.insert(make_tuple(x, y, r));
			}
		}
		else {
			if (pow(c - x, 2) + pow(d - y, 2) < pow(r, 2)) {
				via.insert(make_tuple(x, y, r));
			}
		}
	}
}

int main() {
	cin.tie(NULL);
	ios::sync_with_stdio(false);

	int start_x, start_y, end_x, end_y, a, b, r;
	int n, m;
	cin >> n;
	for (int i = 0;i < n;i++) {
		cin >> start_x >> start_y >> end_x >> end_y;
		cin >> m;
		for (int j = 0;j < m;j++) {
			cin >> a >> b >> r;
			planet(a, b, r);
		}
		search(start_x, start_y, end_x, end_y);
		int count = via.size();
		cout << count<<"\n";
		P.clear();
		via.clear();
	}
	return 0;
}

'백준 문풀' 카테고리의 다른 글

11051  (0) 2024.07.22
백준 1485  (2) 2024.07.15
백준 1931  (0) 2024.05.20
백준 11047  (0) 2024.05.15
백준 11866  (0) 2024.05.08