8.기본수학2 터렛

🚩 기본수학2단계 터렛

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



🔦 문제 알아보기

🎲 문제

A지점의 터렛과 B지점의 터렛이 있다.
본부에서 각 터렛에 적군의 위치를 계산하라는 명령이 떨어졌고, 각 터렛들은 자신의 위치에서 현재 적까지의 거리를 계산했다.
A지점 터렛의 좌표 (x1, y1), B지점 터렛의 좌표 (x2, y2)가 주어지고, 각 터렛과 적군의 거리 r1, r2가 주어졌을 때, 적군이 있을 수 있는 좌표의 수를 구하라.

🔷 입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다.
x1, y1, x2, y2는 -10,000 <= n <= 10,000 인 정수이며, r1, r2는 10,000보다 작거나 같은 자연수이다.

🔶 출력

각 테스트 케이스마다 적군이 있을 수 있는 위치의 수를 출력하고, 만약 위치의 수가 무한대일 경우 -1을 출력한다.



⚙️ 문제 풀기

✨ 경우의 수 살펴보기

1. distance == 0 and r1 == r2
두 터렛이 같은 위치에 있고, 적군과의 거리가 같을 때, 적이 있을 수 있는 위치가 무한대이다.


2. abs(r1 - r2) < distance < r1 + r2
두 터렛의 거리가 적군과의 거리의 합보다는 작지만 각 적군과의 거리의 차보다는 클 때, 두 원이 만나는 점이 두군데이다.


3. r1+r2 == distance or abs(r1-r2) == distance
두 터렛에서 관측한 적군의 거리의 합이 두 터렛의 거리와 같다. 혹은, 두 거리의 차이가 터렛사이 거리과 같다면, 두 원은 한점에서 만난다.


4. r1+r2 < distance or distance < abs(r2 - r1)
각 터렛에서 관측한 적의 위치가 서로 멀어 원이 겹치지 않는다. 또는 같은 위치에서 서로 관측한 적군과의 거리가 다를 때 또한 겹치지 않는다.

코드

import math

num = int(input())
data = []
for i in range(num):
  data.append(list(map(int, input().split(' '))))

for x1, y1, r1, x2, y2, r2 in data:
  distance = math.sqrt((x1-x2)**2 + (y1-y2)**2)
  
  if(distance == 0 and r1==r2):
    print(-1)
  elif(abs(r1 - r2) < distance < r1 + r2):
    print(2)
  elif(r1+r2 == distance or abs(r1-r2) == distance): #한점에서 만날때
    print(1)
  elif(r1+r2 < distance): #멀어서 떨어짐
    print(0)
  elif(distance < abs(r2 - r1)):
    print(0)

좋은 웹페이지 즐겨찾기