https://www.acmicpc.net/problem/1002
1002번: 터렛
각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.
www.acmicpc.net
repeat = input()
for i in range(0,int(repeat)):
num_list = list(map(int, input().split()))
x1 = num_list[0]
y1 = num_list[1]
r1 = num_list[2]
x2 = num_list[3]
y2 = num_list[4]
r2 = num_list[5]
distance = (((((x2 -x1)**2)+((y2-y1)**2))) ** (1/2))
longLine = 0;
## 빗변 찾기
if r1>r2:
longLine = r1;
twoLine = distance + r2;
else :
longLine = r2;
twoLine = distance+r1;
if longLine < distance :
longLine = distance;
twoLine = r1+r2;
## 출력 시작
if longLine>twoLine:
print(0)
# 모두 같은 경우
elif distance == 0:
# 거리가 0인경우, 같은 점이니까 1개
if r1 == 0:
print(1)
elif r1 != r2:
print(0)
# 거리가 다른 경우, 점 중심으로 거리가 r인 원 생성, 무한
else:
print(-1)
# 직선 거리인 경우
elif distance == r1+r2:
print(1)
# 한쪽 점을 넘어선 직선거리 일 경우
elif (r2-r1) == distance or (r1-r2) == distance:
print(1)
# 2개
else:
print(2)
1일차 : 왜 틀린지 인지 못함
2일차 : 모든 케이스 다 했다고 생각했는데 실제론 케이스 하나 빼먹음.
입력 : 0 0 5 2 0 2
출력 : 0
내 출력 : 2
질문 게시판에 있는 케이스였는데
원 안에서 다른 원이 내접하지 못하는 케이스였다.
사실 정상적인 코드였으면 이 케이스도 걸러낼 수 있어야했는데
삼각형의 성립조건을 이상하게 걸어놨었다.
r1, r2, distance중 어떤 선이 빗변인지 생각을 안하고
생각없이
distance > r1+r2 이런식으로 해놨던 것이다.
그래서 아래 코드 추가했다.
if r1>r2:
longLine = r1;
twoLine = distance + r2;
else :
longLine = r2;
twoLine = distance+r1;
if longLine < distance :
longLine = distance;
twoLine = r1+r2;
if longLine>twoLine:
print(0)