[python] 백준 1002번 - 터렛

희희구리·2023년 4월 21일
0

백준

목록 보기
13/21

문제

조규현과 백승환은 터렛에 근무하는 직원이다. 하지만 워낙 존재감이 없어서 인구수는 차지하지 않는다.

이석원은 조규현과 백승환에게 상대편 마린(류재명)의 위치를 계산하라는 명령을 내렸다. 조규현과 백승환은 각각 자신의 터렛 위치에서 현재 적까지의 거리를 계산했다.

조규현의 좌표 (x1, y1)와 백승환의 좌표 (x2, y2)가 주어지고, 조규현이 계산한 류재명과의 거리 r1과 백승환이 계산한 류재명과의 거리 r2가 주어졌을 때, 류재명이 있을 수 있는 좌표의 수를 출력하는 프로그램을 작성하시오.

링크 참조

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

풀이 설명

처음 생각했던 아이디어는 원의 방정식으로 X,Y 중 정수 쌍을 구해보려 하였다.
그렇게 하게 되면 모든 정수 내에서 구해야 하기 때문에 굉장히 코드가 복잡해질 것 같았다.

그래서 조금 다르게 생각해본 것은 삼각형으로 푸는 것이었다.

case은 크게 3개로 나눴다.

  1. 류재명이 조규현과 백승환 사이에 있는 경우.
    1-1. 조규현과 백승환이 같은 곳에 위치하면 류재명은 무한 값을 가짐
  2. 류재명이 조규현과 백승환과 삼각형을 이루고 있는 것과 같은 경우
  3. 류재명이 조규현과 백승환의 거리를 이룰 수 없는 경우

코드

N = int(input())

for _ in range(N):
    x1,y1,r1,x2,y2,r2 = map(int,input().split())
    
    Joe_Baek = (((x1-x2)**2)+((y1-y2)**2))**(1/2)
    distance = [r1,r2,Joe_Baek]
    maxValue = max(distance)
    distance.pop(distance.index(maxValue))
    remain = sum(distance)
    
    if maxValue < remain:
        print(2)
    elif maxValue == remain:
        if x1 == x2 == y1 == y2:
            print(-1)
        else:
            print(1)
    else:
        print(0)

테스트케이스 N개 만큼 for문을 돌면서 조규현의 좌표 (x1,y1)와 백승환의 좌표 (x2,y2)을 받는다.
그리고 조규현과 류재명의 거리를 r1, 백승환과 류재명의 거리를 r2로 받는다.

입력 받은 값들로 조규현과 백승환의 거리를 계산한다. (점과 점사이의 거리 공식 참고)

점 A (x1,y1) 와 점 B (x2,y2) 의 거리 AB의 공식은 다음과 같다.

그리고 위에 언급한 3가지의 경우로 나눈다.

  • 조규현과 백승환, 류재명이 삼각형으로 이루어져 있는 경우

이 경우, 세 변의 길이를 알기 떄문에 삼각형의 성립조건에 의해 가장 긴 변이 짧은 변들의 합보다 작은 지 확인하였다. 삼각형이 성립된다면 경우 2개를 출력한다.
왜냐하면, 류재명이 백승환과 조규현의 위쪽에 있을 수도 있고, 아래쪽에 있을 수도 있기 때문!

  • 조규현과 백승환, 류재명이 일직선을 이루는 경우

이 경우, 최대 거리가 나머지 거리들과 같은지 확인한다.
또한, 그 중에서도 조규현과 백승환의 좌표가 똑같게 되면 류재명은 무한값을 가지게 됨으로
-1을 출력하고 그 외는 1을 출력한다.

  • 조규현과 백승환, 류재명이 일직선도, 삼각형도 아닌 경우

이 경우는 거리들로 만들 수 있는 관계가 없기 때문에 있을 수 있는 위치가 0이다.
따라서 0을 출력하면 된다.

💌

후기

실버 1 입성기 :>

profile
beginner :>

0개의 댓글