📌문제 설명
https://www.acmicpc.net/problem/1002
(x1, y1), (x2, y2) , r1, r2 가 주어졌을 때 두 점에서 두 거리를 만족하는 좌표의 개수를 구하는 문제였습니다.
💡생각
처음에는 방식이 생각나지 않아서 -10000 ~ 10000 까지 다 대입해서라도 풀어봐야 겠다고 생각했습니다.
#include <iostream>
#include <cmath>
using namespace std;
/*
* r1(류재명) = x1, y1 (조규현) 에서의 거리
* r2(류재명) = x2, y2 (백승환) 에서의 거리
* 루트((x3 - x1)^2 + (y3 - y1)^2) == r1
* 루트((x3 - x2)^2 + (y3 - y2)^2) == r2
* 두 조건이 성립해야 위치로 인정된다.
*/
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int T;
cin >> T;
int x1, x2, x3;
int y1, y2, y3;
int r1, r2;
for(int i = 0; i < T; i++){
cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
int answer = 0;
if(r1 == 0 || r2 == 0){
cout<<-1;
continue;
}
for(int j = -10000; j <= 10000; j++){
for(int k = -10000; k <= 10000; k++){
if(sqrt(pow(x1 - j,2) + pow(y1 - k, 2)) == r1 &&
sqrt(pow(x2 - j,2) + pow(y2 - k, 2)) == r2){
answer++;
}
}
}
cout << answer << '\n';
}
}
이건 좀 아닌 거 같은데...
🔥풀이
풀이를 생각하지 못해서 다른 풀이 방식을 참조했을 때 수학적인 계산이 필요했다는 걸 알 수 있었습니다.
반지름의 길이와 두 점 사이의 거리를 활용해서 원을 그렸을 때 몇개의 지점에서 만나는지를 확인하면 풀 수 있는 문제였습니다.
#include <iostream>
#include <cmath>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int T;
cin >> T;
int x1, x2;
int y1, y2;
int r1, r2;
for(int i = 0; i < T; i++){
cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
double distance = sqrt(pow(x1 - x2,2) + pow(y1 - y2, 2));
double distance2 = r1 > r2 ? r1 -r2 : r2 - r1;
if(distance == 0 && r1 == r2) //두 점이 같은 위치에 있고 반지름 길이도 같을 때
{
cout << "-1" <<"\n";
}
else if(r1 + r2 == distance || distance2 == distance){
//두 점의 위치는 다르지만 하나의 점에서 만나게 될 때
cout << "1" << "\n";
}
else if(r1 + r2 > distance && distance2 < distance){
//두 점의 위치는 다르지만 두 점에서 만날 때
cout << "2" << "\n";
}else {
//만나는 점이 없을 때
cout << "0" << "\n";
}
}
}
📕참고
https://gaeunhan.tistory.com/57
[C++ 백준] 1002 터렛
블로그에 올리는 모든 문제 풀이는 깃허브에 올려져 있습니다. 문제 설명 조규현의 좌표(X1, Y1)와 백승환의 좌표(X2, Y2)가 주어지고, 조규현이 계산한 류재명과의 거리 r1과 백승환이 계산한 류재
gaeunhan.tistory.com
https://reo91004.tistory.com/146
[백준 / BOJ] 1002번 터렛 (C++, Python)
링크 : https://www.acmicpc.net/problem/1002 1002번: 터렛 각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다
reo91004.tistory.com
'알고리즘 > 문제풀이 :백준' 카테고리의 다른 글
[백준][C++] 토너먼트 (0) | 2025.04.29 |
---|---|
[백준][c++] 1024-수열의 합 (0) | 2025.04.13 |
[백준][JAVA] 2493 탑 (1) | 2025.01.20 |
[백준][Java] 10799 - 쇠막대기 (1) | 2025.01.15 |
[백준][JAVA] 2579 계단 오르기 (0) | 2025.01.06 |