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)
'항해99 > [항해99] 알고리즘' 카테고리의 다른 글
[BOJ] 1436 영화감독 숌 파이썬 (0) | 2024.01.29 |
---|---|
[BOJ] 9012 괄호 파이썬 (0) | 2024.01.15 |
[알고리즘] 백준 19637 IF문 좀 대신 써줘 (0) | 2024.01.04 |
[BOJ] 10816 숫자카드 2 (0) | 2023.12.31 |
[항해99] DP - Dynamic Programming (0) | 2023.12.30 |