미소를뿌리는감자의 코딩

[백준 2024/02/22] 1002번 터렛 - python ver. 본문

코딩 테스트/백준

[백준 2024/02/22] 1002번 터렛 - python ver.

미뿌감 2024. 2. 22. 17:44
728x90

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

 

1002번: 터렛

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

www.acmicpc.net

 

1. 접근 방법

이전에 자바로 풀어보았던 1002번 터렛을 다시 python으로 풀어보았다.

 

2개의 원이 접하는 점의 개수를 구하는 방법으로 문제를 접근하였다.

 

1. 두 점의 사이의 거리가 0 일 때,

- 반지름의 길이가 같다면 : 무한

- 반지름의 길이가 다르다면 : 0

 

2. 반지름을 더한 것 <= 두 점 사이의 거리

- 같다면 : 1

- < 이라면 : 0

 

3. | 두 반지름의 차 | >= d :

- 같다면 : 1

- > 라면 : 0

 

4. 그 외

- 2

 

총 7 가지의 경우의 수이며, 두 점에서 만나는 경우를 else로 생각하고 접근한다면 보다 쉽게 풀 수 있다.

또한 내접, 외접도 생각해서 풀면 좋다.

 

이런식으로 경우를 나누어서 if else 문을 구성해 주었다.

https://potatoscatteringsmile.tistory.com/25

 

[백준 2024/01/17] 1002번 터렛

https://www.acmicpc.net/problem/1002 1002번: 터렛 각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 $-1$ 출력한다. www.acmi

potatoscatteringsmile.tistory.com

여기에서 원의 경우의 수를 적은 것을 확인할 수 있다.

 

2. 코드

import math


def calculate_distance(x1, y1, x2, y2):
    return math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)


def possible_location(d, r1, r2):
    if d == 0:
        if r1 != r2:
            return 0
        return -1

    elif d >= r1 + r2:
        if r1 + r2 == d:
            return 1
        return 0

    elif abs(r1 - r2) >= d:
        if abs(r1 - r2) > d:
            return 0
        return 1
    return 2


def main():
    for i in range(int(input())):
        x1, y1, r1, x2, y2, r2 = map(int, input().split())
        d = calculate_distance(x1, y1, x2, y2)

        print(possible_location(d, r1, r2))


if __name__ == '__main__':
    main()
728x90