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

 

1002번: 터렛

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

www.acmicpc.net

 

x1, y1,.r1이 나오면 원이라고 생각하자.

 

두 원의 거리에 따른 원의 관계를 코드로 구현하는 문제였다.

 

틀린 코드

import math

T = int(input())

for _ in range(T):
    x1, y1, r1, x2, y2, r2 = map(int, input().split())

    # dist1 = 두 점의 직선 거리 (두 원의 중심간 거리)
    dist1 = math.sqrt((x1-x2)**2 + (y1-y2)**2)

    # dist2 = 두 원의 반지름의 합
    dist2 = abs(r1+r2)

    # dist3 = 두 원의 반지름의 차
    dist3 = abs(r1-r2)

    # 두 원이 서로 안 만날 때
    if dist1 > dist2 or dist1 < dist3:
        print(0)

    # 한 점에서 만날 때
    elif dist1 == dist2 or dist3 == dist1:
        print(1)

    # 두 원이 같을 때 ( 무한대 -> -1출력)
    elif x1 == x2 and y1 == y2 and r1 == r2:
        print(-1)

    # 두 점에서 만날 때
    else:
        print(2)

 

if 와 elif 를 통해서 구현했는데, 25%에서 오답이라 왜 그럴까 ... 생각해봤는데 겹치는 경우가 생긴다.

 

두 원이 서로 같은 원 이라면 중심점간 거리 = 0 인데, 반지름간 차도 0 이라서 한 점에서 만난다 라는 조건을 통과하게 되어 1을 출력하므로 앞조건에서 미리 체크해줘야한다.

 

정답코드

import math

T = int(input())

for _ in range(T):
    x1, y1, r1, x2, y2, r2 = map(int, input().split())

    # dist1 = 두 점의 직선 거리 (두 원의 중심간 거리)
    dist1 = math.sqrt((x1-x2)**2 + (y1-y2)**2)

    # dist2 = 두 원의 반지름의 합
    dist2 = abs(r1+r2)

    # dist3 = 두 원의 반지름의 차
    dist3 = abs(r1-r2)

    # 두 원이 같을 때 ( 무한대 -> -1출력)
    if x1 == x2 and y1 == y2 and r1 == r2:
        print(-1)

    # 두 원이 서로 안 만날 때
    elif dist1 > dist2 or dist1 < dist3:
        print(0)

    # 한 점에서 만날 때
    elif dist1 == dist2 or dist3 == dist1:
        print(1)

    # 두 점에서 만날 때
    else:
        print(2)