백준 실버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 🔍
- 두 원의 접점의 개수 구하는 방법 : https://acstory.tistory.com/236
후기
수능 볼 때 배운게 나와서 뭔가 반가운 문제였습니다 ㅋㅋ 버릇 못 버려서 원의 방정식 구하고 두 점중 교차하는 점 하나 찾고 기울기 구해서 접점 없으면 1로 출력하고 있으면 2출력하고 뭐 그렇게 하려고 했는데 갑자기 아닌 거 같아서 결국엔 구글링 했습니다 재밌네요
'코딩테스트' 카테고리의 다른 글
[백준] 9375 패션왕 신해빈 - python (1) | 2023.02.06 |
---|---|
[백준] 3077 임진왜란 - python (2) | 2023.02.06 |
[백준] 1966 프린터 큐 - python (2) | 2023.02.04 |
[백준] 1783 병든 나이트 - python (0) | 2023.02.04 |
[백준] 2346 풍선 터뜨리기 - python (1) | 2023.02.03 |