본문 바로가기
백준

[1004] 어린 왕자

by kmyobin 2022. 8. 12.

 

이건 정말 어떻게 푸는지 전~혀 모르겠어서 구글링을 했다 ㅎㅎㅜ

 

문제 조건에 행성계의 경계가 맞닿거나 교차하는 경우가 없다고 했으므로 몇가지 조건만 따져주면 된다

 

1. 같은 행성계에 존재하면 진입/이탈 0

2. 이탈해야한다면 출발점에서 이탈

3. 진입해야한다면 도착점으로 진입

 

같은 행성계에 있으면 애초에 진입하거나 이탈할 일 없으므로 continue로 반복문을 빠져나왔다

이탈하는 것은 출발점이 속한 행성계로부터 이탈하는 것이고,

진입하는 것은 도착점이 속한 행성계로 진입하는 것이기 때문에!

원 안에 속해있는지 공식을 세워서 따져줬다

 

전체 코드는 아래와 같다

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

int T, n;
double x_1, y_1, x_2, y_2;

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

	cin >> T;

	for (int i = 0; i < T; i++)
	{
		int cnt = 0;
		cin >> x_1 >> y_1 >> x_2 >> y_2;
		cin >> n;
		for (int i = 0; i < n; i++)
		{
			int cx, cy, r;
			cin >> cx >> cy >> r;

			// 같은 행성계에 존재한다면
			if (sqrt(pow(x_1 - cx, 2) + pow(y_1 - cy, 2)) < r &&
				sqrt(pow(x_2 - cx, 2) + pow(y_2 - cy, 2)) < r) {
				continue;
			}

			// 이탈해야한다면
			if (sqrt(pow(x_1 - cx, 2) + pow(y_1 - cy, 2)) < r) {
				cnt++;
			}
			// 진입해야한다면
			if (sqrt(pow(x_2 - cx, 2) + pow(y_2 - cy, 2)) < r) {
				cnt++;
			}

		}
		printf("%d\n", cnt);
	}
}

 

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

[1934] 최소공배수  (0) 2022.08.19
[1358] 하키  (0) 2022.08.12
[2477] 참외밭  (0) 2022.08.12
[11478] 서로 다른 부분 문자열의 개수  (0) 2022.07.30
[1269] 대칭 차집합  (0) 2022.07.30

댓글