[백준] 터렛 : 1002번 (파이썬)

뚝딱이 공학도·2022년 3월 11일
0

문제풀이_백준

목록 보기
84/159



문제



나의 답안

import math

t=int(input())

for i in range(t):
    
    x1,y1,r1,x2,y2,r2=map(int,input().split())
    cnt=0
    d=math.sqrt(abs(x2-x1)**2+abs(y2-y1)**2)
    if d==0: #거리가 0일때, 즉 동심원인 경우
        if r2==r1:#1) 두 원이 일치하는 경우
            cnt=-1
        else:#2) 내부에 포함되는 경우
            cnt=0
    else: #동심원이 아닐 때
        if d==r1+r2:#3) 한점에서 외접하는 경우
            cnt=1 
        elif d==abs(r2-r1):#4) 한점에서 내접하는 경우
            cnt=1
        elif abs(r2-r1)<d<r2+r1: #5) 두점에서 외접하는경우
            cnt=2
        else:#6)만나는 점이 없는 경우, d<abs(r2-r1)
            cnt=0
    print(cnt)
    

접근방법

  • 두 원의 위치관계를 알아야 한다.
  • 두 원의 접점의 개수를 알아내면 구할 수 있는 문제이다.
  • 두 원의 중심사이 거리 공식, 즉 두 점 사이 거리 공식을 알아야 한다.
    두 점 사이 거리 공식
    AB=(x2x1)2+(y2y1)2\overline{AB} = \sqrt{(x_2-x_1)^2+(y_2-y_1)^2}
  • abs(절댓값) maht 모듈의 sqrt(제곱근)을 사용했다.

  1. 테스트 케이스 수를 입력받고, 해당 수만큼 반복한다.
  2. 매 반복마다 x, y, r을 입력받고, 카운터 변수를 초기화해준다.
  3. 두 점 사이 거리를 구한다.
  4. 두 원의 위치관계에 따라 조건문을 진행한다.
  5. 두 원이 동심원인 경우
    5-1. 두 원이 정확히 일치하는 경우
    => 이 때는 원 내부의 무수한 점이 모두 포함되기에 cnt에 -1을 저장한다
    5-2. 두 원이 동심원인 경우이면서, 한 원이 다른 원에 포함되는 경우
    => 접점이 없으므로 0
  6. 두 원이 동심원이 아닌 경우
    6-1. 한점에서 외접하는 경우 => 한점에서 만나므로 1
    6-2. 한점에서 내접하는 경우 => 한점에서 만나므로 1
    6-3. 두점에서 외접하는 경우 => 두점에서 만나므로 2
    6-4. 만나는 점이 없는 경우 => 접점이 없으므로 0
  7. cnt의 값을 출력해준다.

두 원의 위치 관계

  • 두 원의 접점이 0개
  • 접점이 0개이면서 동심원인 경우
  • 두 원의 접점이 1개
  • 두 원의 접점이 2개
  • 두 원의 접점이 무한개

0개의 댓글