알고리즘 풀이
[백준][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함수를 사용하자.