본문 바로가기
알고리즘

백준, Python - 터렛 (1002)

by jun.s.gi 2022. 11. 23.
728x90

문제가 짧지 않아 복잡해 보이는 문제이지만 두 개의 원의 교점 개수를 구하는 문제이다.

 

두 정점 사이의 거리를 구하고 두 원의 반지름을 통해 교점 개수를 구할 수 있었다.

 

1. 두 원점이 같을 경우
import math as m
N = int(input())

for _ in range(N):
    x1, y1, ar, x2, y2, br = map(int, input().split())

    # 정점이 같을 경우
    if x1 == x2 and y1 == y2:
        if ar == br:
            print(-1)
        else:
            print(0)

https://mathbang.net/101

이러한 모양은 접점이 없으므로 0 출력

사진은 없지만 반지름 길이도 같아 하나의 원처럼 보이는 경우 접점이 무수히 많으므로 -1 출력

 

2. 두 정점의 위치가 서로 다를 경우 ( 외접하거나 떨어져있거나 )
    else:
        #두 점 사이의 거리 (피타고라스 정리)
        distance = m.sqrt((x2-x1)**2 + (y2-y1)**2)
        
        # 두 원의 반지름 길이와 거리가 같으면 교점이 하나
        if distance == ar + br:
            print(1)

        # 두 원의 반지름 길이가 두 점 사이의 거리보다 짧다면
        # 서로 완전히 떨어져 있으므로 교점이 없음
        elif distance > ar + br:
            print(0)

먼저 두 점 사이의 거리를 구합니다.

조건문 순서대로 다음과 같을 때입니다.

https://mathbang.net/101

2. 두 정점의 위치가 서로 다를 경우 ( 내접 )
        # 원이 내접할 때 교점 1개 ( 아래 그림의 3번 그림 )
        elif distance == abs(ar - br):
            print(1)

        # 큰 원에 내접하지 않을 때 0개 ( 아래 그림의 6번 그림 ) 
        elif distance < abs(ar - br):
            print(0)


        # 그 외 1번 그림
        else: print(2)

https://mathbang.net/101

 

 

 

실수

처음에는 위의 코드와 살짝 다르게 제출했을 때 틀렸습니다가 나왔다. 질문 검색을 해봤을 때 웬만한 반례들을 실행시켜도 전부 정답이 나왔는데 힌트를 보고 깨달았다.

R을 int 단위로 버림한 다음에 R == r1 + r2인지 검사해도 안 됩니다. 버림하는 순간 더 이상 거리가 아닙니다.

여기서 R은 위 코드의 distance에 해당한다.

 

처음에는 무슨말이지 싶었는데 처음에 두 점 사이의 거리를 구할 때 나온 결과를 정수로 바꿔버린 것이다.  

distance = round(m.sqrt((x2-x1)**2 + (y2-y1)**2))

두 원점 사이의 거리가  2√2일 때 거리를 그냥 2로 바꿔버려 두 점 사이의 거리가 더 짧아져버려 원래 떨어져서 0이 나와야 될것이 1로 나왔었다. 

ex) 정점 (0,0) 반지름이 1, 정점 (3, 3) 반지름이 3일 때 두 점사이의 거리는 4.2426.....

하지만 거리의 소수점을 버려버려 원래 접점이 없어야 하지만 1을 출력하는 오류 발생

728x90