** 알고리즘 오답노트 21 (백준 - 1002)

박경준·2021년 6월 21일
0

알고리즘 문제풀이

목록 보기
24/24

두 원, 두 원의 중심과 임의의 점 사이의 거리 이렇게 주어졌을때 두 원 사이에 접점이 생길 수 있는지를 알아보는 문제이다.
원을 그려보면서 접점이 무한, 0개, 1개, 2개인 경우를 생각해본다.

  • 접점이 하나라고 가정해보면...
    그 경우의 수는 외접할때와 내접할때가 있다.
외접 : r1 + r2 == r(두 원 중심 사이의 거리)
내접 : r1 > r2 라면 r2 + r == r1
r2 > r1 이라면 r1+ r2 == r2

이런식으로 디테일하게 분기할수도 있겠지만
r1, r2, r 중 가장 큰 값과 나머지 두 개의 값이 같은 경우
즉,

array = [r1, r2, r]
max(array) == sum(array.remove(max(array)))

이렇게 표현할수도 있다.

import sys
num = int(sys.stdin.readline())
for _ in range(num):
  x1, y1, r1, x2, y2, r2 = map(int, sys.stdin.readline().split())
  
  r = ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5
  m = max(r1, r2, r)
  array = [r1, r2, r]
  array.remove(m) 
  # 원이 닿는지 안닿는지는 r1, r2, r 중 가장 큰 값과 나머지 두 개의 대소관계에 따라 결정된다.
  # 굳이 r이 가장 길때, r2가 가장 길때 이런 식으로 세분화하지 않아도 된다.
  sum_array = sum(array)
  
  if r == 0 and r1 == r2:
    print(-1)
  else:
    if m > sum_array: # 두 원이 서로 떨어져있거나, 한 원이 다른 원을 품고있을때
      print(0)
    elif m == sum_array: # 외접, 내접
      print(1)
    elif m < sum_array: # 두 점에서 만남
      print(2)
profile
빠굥

0개의 댓글