본문 바로가기
백준 알고리즘(BOJ)

백준 알고리즘 1002 (터렛) - C++, Python

by Think_why 2019. 10. 16.

[문제] 백준 알고리즘 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

댓글