알고리즘 풀이

[백준][C++] 1004번: 어린 왕자

성장호소 2024. 3. 29. 18:10

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

 

1004번: 어린 왕자

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

www.acmicpc.net

 

출발점과 도착점이 주어지고 행성계의 중점과 반지름이 주어질 때 최소한의 행성계의 진입/이탈 횟수를 구하는 문제이다.

 

출발점과 도착점 중 하나만 주어진 행성계에 포함되어야 이동하는 경로에 진입/이탈이 한 번 발생한다.

나머지 경우에는 진입/이탈이 발생하지 않는다. 둘 다 행성계 밖에 있으면 진입할 필요가 없고 둘 다 안에 있으면 이탈할 필요가 없기 때문이다.

 

이 아이디어를 통해 원의 방정식으로 풀어보았다.

 

#include <iostream>
#include <cmath>

using namespace std;

int main(void) {
	int T;
	cin >> T;
	
	while(T--) {
		int x1, y1, x2, y2;
		cin >> x1 >> y1 >> x2 >> y2;
		
		int n;
		cin >> n;
		
		int cnt=0;
		int cx, cy, r;
		for(int i=0; i<n; i++) {
			cin >> cx >> cy >> r;
			
			if(pow(x1-cx, 2) + pow(y1-cy, 2) < pow(r, 2) && pow(x2-cx,2) + pow(y2-cy,2) > pow(r, 2)) {
				cnt++;
			} else if(pow(x1-cx, 2) + pow(y1-cy, 2) > pow(r, 2) && pow(x2-cx,2) + pow(y2-cy,2) < pow(r, 2)) {
				cnt++;
			}
		}
		
		cout << cnt << "\n";
	}
}

 

 

원의 방정식을 구할 때 제곱 연산을 위해 ^연산자를 사용했는데 계속 오답이 나와서 찾아봤더니 C언어에서 ^연산자는 비트 연산자로 사용된다..ㅎ

따라서 나중에 제곱 연산을 할 때는 cmath 라이브러리의 내장 함수인 pow함수를 사용하자.