[문제] 백준 알고리즘 1002 (터렛)
> https://www.acmicpc.net/problem/1002
원의 중심 (x1, y1)과 반지름 r1, 원의 중심 (x2, y2)과 반지름 r2가 주어진다.
두 개의 원이 겹치는 접점의 갯수를 출력하는 문제이다.
두 개의 원이 점점 다가가는 순서로 표현을 해보면, 아래의 6가지 방식이 될 것 같다.
1. 멀리 떨어져 있음 2. 1개의 접점 3. 2개의 접점
4. 내부 1개의 접점 5. 내부에서 안 겹침 6. 아예 같음
이러한 경우의 수를 (x1, y1), (x2, y2)의 거리와 r1, r2의 (+,-) 조합의 거리로 구하면 된다.
편의를 위해 중심 점이 같을 때를 제일 먼저 처리했다.
[C++]
#include <cstdio>
#include <cmath> // pow, sqrt
using namespace std;
int find_pos(int x1, int y1, int r1, int x2, int y2, int r2) {
if (x1 == x2 && y1 == y2) { // x, y 좌표 같음
if (r1 == r2) {
return -1; // 같을 때
}
else {
return 0; // 만나지 않음
}
}
else {
int dist = 0;
dist = pow(x1 - x2, 2) + pow(y1 - y2, 2);
if (dist <= pow(r1 - r2, 2)) { // 하나가 내부에
if (dist == pow(r1 - r2, 2)) { // 접점1
return 1;
}
else { // 안겹침
return 0;
}
}
else if (pow(r1 - r2, 2) < dist && dist <= pow(r1 + r2, 2)) { // 겹침
if (dist == pow(r1 + r2, 2)) { // 접점1
return 1;
}
else { // 접점2
return 2;
}
}
else { // 멀리
return 0;
}
}
}
int main() {
int t;
int x1 = 0, y1 = 0, r1 = 0;
int x2 = 0, y2 = 0, r2 = 0;
scanf("%d", &t);
for (int i = 0; i < t; i++) {
scanf("%d %d %d %d %d %d", &x1, &y1, &r1, &x2, &y2, &r2);
printf("%d\n", find_pos(x1, y1, r1, x2, y2, r2));
}
return 0;
}
[Python]
import sys
T = int(sys.stdin.readline())
def find_pos(x1, y1, r1, x2, y2, r2):
if x1 == x2 and y1 == y2: # x, y 좌표 같음
if r1 == r2: # r도 같음
return -1
else: # r은 다름
return 0
else:
dist = (x1 - x2) ** 2 + (y1 - y2) ** 2
if dist <= (r1 - r2) ** 2: # 하나가 내부에 있음
if dist == (r1 - r2) ** 2: # 접점1
return 1
else:
return 0
elif (r1 - r2) ** 2 < dist <= (r1 + r2) ** 2: # 겹쳐있음
if dist == (r1 + r2) ** 2: # 접점1
return 1
else:
return 2
else: # 아예 떨어져 있음
return 0
for _ in range(T):
x1, y1, r1, x2, y2, r2 = map(int, sys.stdin.readline().split())
print(find_pos(x1, y1, r1, x2, y2, r2))
728x90
'백준 알고리즘(BOJ)' 카테고리의 다른 글
백준 알고리즘 1436 (영화감독 숌) - C++, Python (0) | 2019.10.16 |
---|---|
백준 알고리즘 1012 (유기농 배추) - C++, Python (0) | 2019.10.16 |
백준 알고리즘 2667 (단지번호붙이기) - C++, Python (0) | 2019.10.16 |
백준 알고리즘 3053 (택시 기하학) - C++, Python (0) | 2019.10.16 |
백준 알고리즘 2606 (바이러스) - C++, Python (0) | 2019.10.16 |
댓글