새소식

백준(BOJ)

[백준] 1002번 터렛 문제 풀이 : 파이썬(python) 코드 설명

  • -
반응형

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

 

 

 

1002번: 터렛

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

www.acmicpc.net

 


Hint

 

위 문제는 기하학으로 분류되어 있으며

기하학과 관련된 풀이를 진행하면 쉽다.

또한 좌표와 거리가 주어진 것으로 보아

원의 위치 관계를 생각해보면 된다.

 

 


Solution

 

 

해결책은

원의 위치 관계에 대한 경우의 수를

생각하면 된다

 

여기서 dist는 distance의 약자로

원의 중심 사이의 거리를 나타냈다

 

 

1) 원이 접하는 경우

외접하는 경우와 내접하는 경우가 있다

 

 

 

 

2) 원이 만나지 않는 경우

 

 

 

두 번째 사진과 세 번째 사진은 거의 동일하지만

내 코드에서는 서로 다른 경우로 나눴다

 

 

3) 원이 겹치는 경우

 

두 경우가 있다

완전 겹치는 경우와 두 점이 겹치는 경우

겹치는 경우는 이 두가지 경우밖에 없다.

 

내 코드에서는 위 경우와 조금 다르게 생각해봤다.

 

 

T = int(input())
for i in range(T):
    A=list(map(int,input().split()))
    dist = ((A[0]-A[3])**2 + (A[1]-A[4])**2)**(1/2)
    if dist == 0:
        if A[2]==A[5]:
            print(-1)
        else:
            print(0)
    elif dist < abs(A[2]-A[5]):
        print(0)
    elif dist == abs(A[2]-A[5]):
        print(1)
    elif A[2]+A[5] < dist:
        print(0)
    elif A[2]+A[5] == dist:
        print(1)
    else:
        print(2)

먼저 공백으로 나뉜 입력들을 리스트로 저장하였다.

A[0]=x1, A[1]=y1, A[2]=r1, A[3]=x2, A[4]=y2, A[5]=r2로 저장될 것이고

dist를 구하는 것은 점과 점 사이의 거리를 구하는 공식을 대입한 것이다

 

 

    if dist == 0:
        if A[2]==A[5]:
            print(-1)
        else:
            print(0)

dist가 0인 경우를 먼저 생각했다.

dist가 0이란 것은 원의 중심이 서로 겹친다는 것

여기서 원의 반지름이 다르다면 서로 만나지 않는 것으로 0 출력

반지름이 같다면 완전히 겹치는 것으로 -1 출력

 

    elif dist < abs(A[2]-A[5]):
        print(0)
    elif dist == abs(A[2]-A[5]):
        print(1)

두 번째로는

원의 반지름의 차이와 dist와의 관계반지름의 차이가 dist보다 크다면한 원 안에 다른 원이 있지만 만나지 못하는 경우이다.

 

그리고 dist와 반지름의 차이가 같다면한 원과 다른 원이 내접하는 것이다.

 

여기서 dist=0 인 경우는 위에서 제거해줬기 때문에두 원의 중심의 위치는 다르며반지름이 같거나 차이가 dist보다 작다면 다른 경우에 해당한다

 

    elif A[2]+A[5] < dist:
        print(0)
    elif A[2]+A[5] == dist:
        print(1)
    else:
        print(2)

마지막이다원의 중심 사이 거리가 반지름의 합보다 크다면

두 원은 만날 수 없다 (2-1 그림 참고)

 

중심 사이의 거리와 반지름의 합이 같다면

두 원은 접하는 것이다(1-1 그림 참고)

 

마지막으로 이외의 모든 경우는

원과 원이 두 점에서 만난다.

 

아까 위에서 걸러주지 못한| r2-r1 | < dist는

만약 r1+r2가 dist보다 크거나 같다면 자동으로 걸러진다.

 

즉| r2-r1 |  < dist 이면서 r1+r2 > dist인 경우만

else로 나올 수 있다.

 

 

 

 

 

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.