https://www.acmicpc.net/problem/1004
문제
어린 왕자는 소혹성 B-664에서 자신이 사랑하는 한 송이 장미를 위해 살아간다. 어느 날 장미가 위험에 빠지게 된 것을 알게 된 어린 왕자는, 장미를 구하기 위해 은하수를 따라 긴 여행을 하기 시작했다. 하지만 어린 왕자의 우주선은 그렇게 좋지 않아서 행성계 간의 이동을 최대한 피해서 여행해야 한다. 아래의 그림은 어린 왕자가 펼쳐본 은하수 지도의 일부이다.
![](https://blog.kakaocdn.net/dn/bBqOu7/btrX3ZiZx6l/QjiiP9iXbWKUqrmK8jE0d0/img.gif)
빨간 실선은 어린 왕자가 출발점에서 도착점까지 도달하는데 있어서 필요한 행성계 진입/이탈 횟수를 최소화하는 경로이며, 원은 행성계의 경계를 의미한다. 이러한 경로는 여러 개 존재할 수 있지만 적어도 3번의 행성계 진입/이탈이 필요하다는 것을 알 수 있다.
위와 같은 은하수 지도, 출발점, 도착점이 주어졌을 때 어린 왕자에게 필요한 최소의 행성계 진입/이탈 횟수를 구하는 프로그램을 작성해 보자. 행성계의 경계가 맞닿거나 서로 교차하는 경우는 없다. 또한, 출발점이나 도착점이 행성계 경계에 걸쳐진 경우 역시 입력으로 주어지지 않는다.
입력
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 첫째 줄에 출발점 (x1, y1)과 도착점 (x2, y2)이 주어진다. 두 번째 줄에는 행성계의 개수 n이 주어지며, 세 번째 줄부터 n줄에 걸쳐 행성계의 중점과 반지름 (cx, cy, r)이 주어진다.
출력
각 테스트 케이스에 대해 어린 왕자가 거쳐야 할 최소의 행성계 진입/이탈 횟수를 출력한다.
코드
#include <algorithm>
#include <cmath>
#include <iostream>
#include <map>
#include <set>
#include <vector>
using namespace std;
int getDistance(int x, int y, int cx, int cy){
return (x-cx)*(x-cx) + (y-cy)*(y-cy);
}
int main(void) {
int T;
int x1, y1, x2, y2;
int n;
cin >> T;
for(int i=0; i<T; ++i){
int ans = 0;
cin >> x1 >> y1 >> x2 >> y2;
cin >> n;
for(int j=0; j<n; ++j){
int cx, cy, r;
cin >> cx >> cy >> r;
if(getDistance(x1,y1,cx,cy) <r*r || getDistance(x2, y2, cx, cy) < r*r){
ans++;
}
if(getDistance(x1,y1,cx,cy) <r*r && getDistance(x2, y2, cx, cy) < r*r){
ans--;
}
}
cout << ans << '\n';
}
return 0;
}
차근차근 생각하기만 하면 어렵지 않은 문제이다.
출발점 혹은 도착점이 행성 안에 있으면 정답값을 +1해주면 되는데 이때 고려해줘야 할게 둘 다 같은 행성안에 있다면 카운트가 되면 안된다.
그래서 if문의 ||(or게이트)로 한번 답을 구하고 &&(and게이트)로 답을 걸러줬다.
이때 갑자기 헷갈렸던게 or게이트가 true, true 일때도 true로 반환되는 것이었나 였다.
결론은 or게이트는 둘다 true일때도 true로 반환된다. 절대 헷갈리지 말자.
'PS > 기타 알고리즘' 카테고리의 다른 글
[2981] (C++) 검문 (0) | 2023.02.06 |
---|---|
[1934] 최소공배수 (0) | 2023.02.06 |
[3053] 택시 기하학 (0) | 2023.02.05 |
[2477] 참외밭 (0) | 2023.02.05 |
[3009] 네 번째 점 (0) | 2023.02.05 |