본문 바로가기
코딩테스트

[백준] 1002 터렛 - python

by CuckooBird 2023. 2. 5.

백준 실버3 1002 터렛 python

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

 

1002번: 터렛

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

www.acmicpc.net


문제 이해

조규현의 좌표를 중심점으로 r1을 반지름으로 하는 원을 그려 류재명이 있을 범위를 나타내줍니다.

마찬가지로 백승환을 중심으로 하는 반지름이 r2인 원을 그립니다.

그리고 좌표상으로 두 원의 접점이 생기거나 생기지 않게 되는데, 접점이 생기게 된다면 그 곳이 류재명이 있게 될 위치가 됩니다.

 

첫번째 테스트케이스는 두번 만나므로 2,

두번째 테스트케이스는 한번 만나므로 1,

세번째 테스트케이스는 만지 않으므로 0이 됩니다.

 

류재명이 무한대로 있는 경우는 두 원이 동심원일 경우입니다.

접점의 개수를 구할 때 어떻게 해야할까요? 외접하는 접점과 내접하는 접점으로 나눌 수 있겠습니다.

이 경우를 제외하고는 동심원이면서 반지름의 크기가 같은 경우, 원이 완전히 겹치므로 류재정이 있는 곳이 무한대가 되므로 -1을 출력해줍니다.


코드

맞았습니다가 뜬 코드입니다. - 메모리 31256KB | 시간 40ms | 코드 길이 400B

import sys
T = int(sys.stdin.readline().rstrip())
for _ in range(T):
    x1, y1, r1, x2, y2, r2 = map(int, sys.stdin.readline().rstrip().split())
    d = pow((x1-x2), 2) + pow((y1-y2), 2)
    d = d ** (1/2) # 두 중심사이의 거리
    if d == 0 and r1 == r2: # 동심원이면서 반지름이 같을 경우 무한대
        print(-1)
    elif abs(r1 - r2) < d and d < r1 + r2: # 접점이 두개
        print(2)
    elif d == abs(r1 - r2) or d == r1 + r2: # 접점이 하나
        print(1)
    else: # 그 외는 접점이 없음
        print(0)

Try1. 

틀렸습니다가 뜬 코드입니다. - 코드 길이 444B

import sys
T = int(sys.stdin.readline().rstrip())
for _ in range(T):
    x1, y1, r1, x2, y2, r2 = map(int, sys.stdin.readline().rstrip().split())
    d = pow((x1-x2), 2) + pow((y1-y2), 2)
    d = d ** (1/2)
    if abs(r1 - r2) < d and d < r1 + r2:
        print(2)
    elif d == abs(r1 - r2) or d == r1 + r2:
        print(1)
    elif d < abs(r1 - r2) or d > r1 + r2:
        print(0)
    else: # d == 0 일 경우
        print(-1)
  • d가 0일 경우를 제일 먼저 처리해야 함을 놓쳤습니다.

Try2. 

틀렸습니다가 뜬 코드입니다. - 코드 길이 388B

import sys
T = int(sys.stdin.readline().rstrip())
for _ in range(T):
    x1, y1, r1, x2, y2, r2 = map(int, sys.stdin.readline().rstrip().split())
    d = pow((x1-x2), 2) + pow((y1-y2), 2)
    d = d ** (1/2)
    if d == 0:
        print(-1)
    elif abs(r1 - r2) < d and d < r1 + r2:
        print(2)
    elif d == abs(r1 - r2) or d == r1 + r2:
        print(1)
    else: 
        print(0)
  • 동심원일 경우만 처리 했습니다. -> 반지름이 같은 조건도 추가해야합니다. (첫번째 if문)

Search 🔍

후기

수능 볼 때 배운게 나와서 뭔가 반가운 문제였습니다 ㅋㅋ 버릇 못 버려서 원의 방정식 구하고 두 점중 교차하는 점 하나 찾고 기울기 구해서 접점 없으면 1로 출력하고 있으면 2출력하고 뭐 그렇게 하려고 했는데 갑자기 아닌 거 같아서 결국엔 구글링 했습니다 재밌네요