https://www.acmicpc.net/problem/1002
1) 입력값: 테스트 케이스 T, A의 좌표와 C로부터의 거리(x1, y1, r1), B의 좌표와 C로부터의 거리(x2, y2, r2)
2) 출력값: 가능 위치 수 N
3) 제약조건:
1) A와 B의 거리를 찾는다(distance).
2) distance, r1, r2의 최대값을 구한다(max_dist).
3) distance가 0 이고 r1이 r2가 같을 경우 가능 케이스가 무한대이므로 -1.
4) distance가 r1 + r2 면 가능 케이스 1.
5) max_dist가 distance, r1, r2 중 작은 두 값의 합과 같다면 가능 케이스 1.
6) max_dist가 distance, r1, r2 중 작은 두 값의 합보다 크다면 가능 케이스 0.
7) 그 외의 경우에는 가능 케이스 2.
def find_locations_from_turret():
t = int(input("Enter the number of test cases:"))
result = [];
for i in range(t):
x1 = int(input(f"{i + 1} Enter x1: "))
if x1 > 10000 or x1 < -10000:
print("x1 must be between -10000 and 10000 inclusive.")
return
y1 = int(input(f"{i + 1} Enter y1: "))
if y1 > 10000 or y1 < -10000:
print("y2 must be between -10000 and 10000 inclusive.")
return
r1 = int(input(f"{i + 1} Enter r1: "))
if r1 > 10000 or r1 < 1:
print("r1 must be between 1 and 10000 inclusive.")
return
x2 = int(input(f"{i + 1} Enter x2: "))
if x2 > 10000 or x2 < -10000:
print("x1 must be between -10000 and 10000 inclusive.")
return
y2 = int(input(f"{i + 1} Enter y2: "))
if y2 > 10000 or y2 < -10000:
print("y2 must be between -10000 and 10000 inclusive.")
return
r2 = int(input(f"{i + 1} Enter r2: "))
if r2 > 10000 or r2 < 1:
print("r1 must be between 1 and 10000 inclusive.")
return
distance = ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** (1 / 2)
distances = [ distance, r1, r2 ]
max_dist = max(distances)
distances.remove(max_dist)
possible_locations = -1 if (distance == 0 and r1 == r2) else 1 if (distance == r1 + r2 or max_dist == sum(distances)) else 0 if (max_dist > sum(distances)) else 2
result.append(possible_locations);
for i in result:
print(i)
find_locations_from_turret()
거리에 따른 원의 관계(접점 유무)를 파악하는게 가장 어려웠다.
다행히 비쥬얼 적으로 잘 설명된 자료가 있어서 참조하면서 원 개념을 이해할 수 있었다.
코드 측면에서는 if... else
문을 one-liner
로 짤 수 있는 방법도 배울 수 있었다.