본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 1002번: 터렛 -Python, C++

728x90

[백준알고리즘] 1002번: 터렛 -Python, C++

1002번: 터렛 (acmicpc.net)

 

1002번: 터렛

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

www.acmicpc.net

뭔가 간단히 생각했다가 생각보다 '맞나?' 하면서 생각을 좀 하게 됐다.

 

각각의 경우를 따져보게 되면 그래도 쉽게 풀 수 있다.

  • 0은 하나의 원이 다른 원에 포함되거나, 서로 밖에 위치해 만나지 않는 경우
  • 1은 하나의 원이 다른 원 안에서 포함되면서 한 점에서 만나는 내접하는 경우와, 하나의 원이 다른 원 밖에서 한 점에서 만나는 외접하는 경우
  • 2는 원끼리 겹쳐서 두 점에서 만나는 경우
  • -1은 두 원이 일치하는 경우

음 글로 쓰니까 되게 뭐라 그러는지 모르겠다.

아무튼 밑에 코드 보면 좀 나을 듯 ^^;

 

조규현과 백승환의 위치 사이의 거리를 \(distance\)라 했다.

 

우선, 가장 명확하고 쉬운 것은 \(distance\)가 \(0\) 이고 두 반지름이 같다면, 두 원은 같은 원이다.

\(distance\)의 길이가 두 반지름의 차보다 작거나, 두 반지름의 합보다 크면 두 원은 만나지 않는다.

\(distance\)의 길이가 두 반지름의 차와 같거나 두 반지름의 합과 같다면, 각각 내접과 외접의 경우로 두 원은 한 점에서 만난다.

\(distance\)의 길이가 두 반지름의 합보다 작고 두 반지름의 차보다 크다면, 두 원은 반드시 두 점에서 만나게 된다.

 

\(distance\)를 계산할 때 피타고라스의 정리를 이용한 유클리드 거리를 계산했다. 이때 <cmath> 헤더의 sqrtpow를 사용했다. sqrt의 경우 return type이 double이기 때문에 \(distance\)를 double로 받아서 정확한 계산이 되도록 했다.

 

#include <iostream>
#include <cmath>

void solve(void);

int main(void)
{
	solve();
}

void solve(void)
{
	int test_case;
	std::cin >> test_case;

	for (int t = 0; t < test_case; t++)
	{
		int x_1, y_1, r_1, x_2, y_2, r_2;
		x_1 = y_1 = r_1 = x_2 = y_2 = r_2 = 0;
		std::cin >> x_1 >> y_1 >> r_1 >> x_2 >> y_2 >> r_2;

		double distance = sqrt(pow(x_1 - x_2, 2) + pow(y_1 - y_2, 2));

		int result = 0;
		if (distance == r_1 + r_2 || distance == abs(r_1 - r_2))
			result = 1;
		if (distance < r_1 + r_2 && distance > abs(r_1 - r_2))
			result = 2;
		if (distance == 0 && r_1 == r_2)
			result = -1;

		std::cout << result << std::endl;
	}
}

 

아래는 파이썬 코드다. 기본적인 로직은 똑같이 짰던 것 같다.

for _ in range(int(input())):
    x1, y1, r1, x2, y2, r2 = map(int, input().split())
    if (x1, y1, r1) == (x2, y2, r2):
        print(-1)
        continue

    d = ((x2-x1)**2 + (y2-y1)**2)**0.5
    r = r1 + r2
    if d == r:
        print(1)
    elif d > r:
        print(0)
    else:
        r = abs(r1-r2)
        if d > r:
            print(2)
        elif d == abs(r1-r2):
            print(1)
        else:
            print(0)

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90