백준 1002번: 터렛 - 실버 4

Minhee kang·2021년 9월 22일
0

✔ 풀이 방법1 👉 시간초과

원의 중심과 반지름을 이용하여 적이 있을 수 있는 x, y의 범위를 좁힌 후, (x - x1)2 + (y - y1)2 = r12, (x - x2)2 + (y - y2)2 = r22 을 만족하는 (x, y)의 개수를 구함

def count_place(xyr):
    x1, y1, r1, x2, y2, r2 = xyr

    cnt = 0
    for x in range(max(x1 - r1, x2 - r2), min(x1 + r1 + 1, x2 + r2 + 1)):
        for y in range(max(y1 - r1, y2 - r2), min(y1 + r1 + 1, y2 + r2 + 1)):
            if ((x - x1) ** 2) + ((y - y1) ** 2) == r1 ** 2 and ((x - x2) ** 2) + ((y - y2) ** 2) == r2 ** 2:
                cnt += 1

    return cnt

T = int(input())
for _ in range(T):
    print(count_place(list(map(int, input().split()))))

✔ 풀이 방법2

규현과 승환의 위치와 적 까지의 거리를 이용하여 각각 적이 존재할 수 있는 위치의 집합인 원을 그린다. 두 원이 만나지 않을 때, 한점에서 만날 때, 두점에서 만날 때, 일치할 때 경우를 이용하여 적이 존재할 수 있는 거리의 개수를 구한다.

T = int(input())
for _ in range(T):
    x1, y1, r1, x2, y2, r2 = list(map(int, input().split()))
    r = (((x1 - x2) ** 2) + ((y1 - y2) ** 2)) ** (1 / 2)   #두 중점 사이 거리

    if r == 0 and r1 == r2:  #일치
        print(-1)
    elif r == r1 + r2 or r == abs(r1 - r2):  #한점에서 만날경우 (내접, 외접)
        print(1)
    elif r > r1 + r2 or r < abs(r1 - r2):   #만나지 않을 경우
        print(0)
    else:    #두 점에서 만날경우
        print(2)

📒 만약 적이 위치할 수 있는 좌표들을 구하라고 하면 풀이1이 적절한 풀이이지만 적이 위치할 수 있는 좌표의 개수를 구하는 문제이므로 풀이2가 적절하다.

0개의 댓글