본문 바로가기
문제 풀이/백준

[Python] 백준 1002 - 터렛

by JJong | 쫑 2022. 5. 15.

https://www.acmicpc.net/problem/1002

 

1002번: 터렛

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

www.acmicpc.net

클릭시 해당 문제 사이트로 이동합니다.


해결방법

  • 원의 개념을 알아야 풀 수 있는 문제이다.
  • 원의 교점의 개수를 구하는 문제이다.
  • 두 원이 겹치는 상황을 그림을 그려 이 문제를 풀었다.

풀이

  • d : 두 원점 사이의 거리
겹치지 않는 경우
교점이 하나인 경우
교점이 두개인 경우
두 원이 포개진 경우

 


코드

for _ in range(int(input())): # 테스트케이스 입력 및 반복
  # 입력
  x1,y1,r1, x2,y2,r2 = map(int,input().split()) 
  
  # 두 원 사이의 거리 : d
  d = ((x1-x2)**2 + (y1-y2)**2)**0.5
  
  # 하나의 경우에서만 따지기.
  r1, r2 = max(r1,r2), min(r1,r2)
  
  if x1==x2 and y1==y2 and r1==r2: # 겹치는 경우
    print(-1)
  elif r1+r2<d or r1>d+r2:
    print(0)
  elif r1+r2==d or r1==d+r2:
    print(1)
  elif r1+r2 > d:
    print(2)

코드 설명

1. max와 min 함수를 사용한 이유?

r1, r2 = max(r1,r2), min(r1,r2)

r1과 r2 중에서 어느 반지름이 더 크고, 작게 들어올지 예측이 불가능하다. 그래서 r1은 max, r2를 min으로 설정해두고 풀이를 했다. 이렇게 하면 원1의 크기가 원2의 크기보다 항상 큰 경우이므로, 하나 경우에서만 따질 수 있기 때문이다.


 

댓글