https://www.acmicpc.net/problem/1002
중심이 같을 경우
- 두 원의 반지름이 같으면 만날 수 있는 경우의 수는 매우 많다.
- 두 원의 반지름이 다르면 만날 수 없다.
중심이 다를 경우
- 두 원이 접하면(내/외접) 만날 수 있는 경우의 수는 1이다.
- 두 원 사이의 거리가 두 반지름의 차이보다 클 때
만날 수 있는 경우의 수는 2이다.- 두 원 사이의 거리가 두 반지름의 합보다 클 때
만날 수 있는 경우의 수는 없다.
Before Refactoring
# x1 y1
# x2 y2
# x1 y1에 대한 거리 r1
# x2 y2에 대한 거리 r2
# 가능한 x y 좌표의 수
#각 테스트케이스마다 x,y의 경우의 수 출력
#무한대일 경우에는 -1
import sys
Test_case = int(sys.stdin.readline())
for i in range(Test_case):
x1, y1, r1, x2, y2, r2 = map(int, sys.stdin.readline().split())
length_between_center_of_circle = ((x1 - x2)**2 + (y1 - y2)**2)**0.5
inner_contact_distance = abs(r1 - r2)
outer_contact_distance = abs(r1 + r2)
# 중심이 같을때 (서로 같은 원일때/ 다른원일때)
if x1 == x2 and y1 == y2:
if r1 == r2:
print(-1)
else:
print(0)
# 중심이 다를때 (내접/외접/두 지점이 만날때/만나지않을때)
else:
if length_between_center_of_circle == inner_contact_distance:
print(1)
elif length_between_center_of_circle == outer_contact_distance:
print(1)
elif length_between_center_of_circle > inner_contact_distance:
print(2)
elif length_between_center_of_circle > outer_contact_distance:
print(0)
After Refactoring
함수선언후 행별 숫자를 입력받아 함수호출 및 결과출력
# x1 y1
# x2 y2
# x1 y1에 대한 거리 r1
# x2 y2에 대한 거리 r2
# 가능한 x y 좌표의 수
#각 테스트케이스마다 x,y의 경우의 수 출력
#무한대일 경우에는 -1
import sys
Test_case = int(sys.stdin.readline())
def get_result(length_between_center_of_circle, inner_contact_distance, outer_contact_distance, x1, x2, y1, y2, r1, r2):
# 중심이 같을때 (서로 같은 원일때/ 다른원일때)
if x1 == x2 and y1 == y2:
if r1 == r2:
return -1
else:
return 0
# 중심이 다를때 (내접/외접/두 지점이 만날때/만나지않을때)
else:
if length_between_center_of_circle == inner_contact_distance:
return 1
elif length_between_center_of_circle == outer_contact_distance:
return 1
elif length_between_center_of_circle > inner_contact_distance:
return 2
elif length_between_center_of_circle > outer_contact_distance:
return 0
for i in range(Test_case):
x1, y1, r1, x2, y2, r2 = map(int, sys.stdin.readline().split())
length_between_center_of_circle = ((x1 - x2)**2 + (y1 - y2)**2)**0.5
inner_contact_distance = abs(r1 - r2)
outer_contact_distance = abs(r1 + r2)
print(get_result(length_between_center_of_circle, inner_contact_distance, outer_contact_distance, x1, x2, y1, y2, r1, r2))
일단 쓰면서 로직을 구현하고, 시간이 오래 걸릴것 같으면
과감히 다른 로직을 구현하자
알고리즘을 구현하는데 너무 시간이 오래걸린다
다른 방향으로 생각하는 것도 중요하지만, 시간을 절약하는 것도 매우 중요하다.
10분내외로 생각하고 알고리즘 구현하는 것까지 가능하도록 꾸준히 연습해보자.
https://dongyeopblog.wordpress.com/2016/02/05/python-%EC%A0%9C%EA%B3%B1%EA%B3%BC-%EB%A3%A8%ED%8A%B8-%EA%B5%AC%ED%95%98%EA%B8%B0/
https://blockdmask.tistory.com/380
코드에 대한 이해가 우선이다. sugar syntax보다는 sugar logic!