1002_터렛

Hongil Son·2022년 7월 15일
0

알고리즘

목록 보기
11/19

입력

첫째 줄에 테스트케이스 개수 입력
두번째 줄부터 테스트케이스+1번째 줄까지 x1, y1, r1, x2, y2, r2가 주어짐

출력

각 테스트케이스마다 사람이 존재할 수 있는 위치의 개수를 출력

조건

  • 좌표의 범위는 -10,000 <= x, y <= 10,000
  • 중점에서 사람의 거리는 1<= r <= 10,000

풀이

두 원의 접점을 구하는 공식을 활용해 문제를 풀이

  1. 두 정점 사이의 거리를 구하기 위해 음수를 확인하는 check_neg 함수를 생성하고 x축의 거리와 y축의 거리를 이용해 두 정점의 직선 거리를 구한다.
def check_neg(a, b):
    # a, b 둘다 음수
    if a < 0 and b < 0:
        a, b = abs(a), abs(b)
        if a <= b: return b-a
        else: return a-b
    # 한 쪽만 음수
    elif a < 0: return b-a
    else: return a-b

for _ in range(T):
    ... 
    
    x_dis = check_neg(x1, x2)
    y_dis = check_neg(y1, y2)

    dis = (x_dis**2)+(y_dis**2)
  1. 접점이 무한대인 경우, 한 점에서 만나는 경우, 두 점에서 만나는 경우, 만나지 않는 경우를 판단
    if dis == 0:
        if r1 == r2: print(-1)
        else: print(0)
    elif abs(r1-r2)**2 == dis or (r2+r1)**2 == dis: print(1)
    elif abs(r1-r2)**2 < dis and (r2+r1)**2 > dis: print(2)
    else: print(0)

두 원 사이의 접점 구하기
1. 중점이 같은 경우
중점이 같은 경우는 반지름의 길이를 비교하여 완전 동일한 원 or 만나지 않는 원 판별
2. 외접인 경우
r1+r2 == d
3. 내접인 경우
abs(r1-r2) == d
4. 만나지 않는 경우
r1+r2 < d or (abs(r1-r2) > d and r1!=r2)
5. 서로 다른 두 점에서 만나는 경우
abs(r1-r2) < d < r1+r2
네이버 지식백과_중심거리

전체 코드

터렛

profile
pushing

0개의 댓글