[문제] 백준 알고리즘 1002 (터렛)
> https://www.acmicpc.net/problem/1002
1002번: 터렛
각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.
www.acmicpc.net
원의 중심 (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 | 
댓글