1주차 5번(터렛)
1.문제 링크
https://www.acmicpc.net/problem/1002
2. 풀이 전 계획과 생각
- 단순한 while(condition) 및 반복인자를 통해선 구현불가능.
- x,y를 중심으로 하는 반지름 r인 원을 생각하여 경우의 수를 구현한다.
2-1. 풀이를 위한 접근방식
중심이 같을 경우
- 두 원의 반지름이 같으면 만날 수 있는 경우의 수는 매우 많다.
- 두 원의 반지름이 다르면 만날 수 없다.
중심이 다를 경우
- 두 원이 접하면(내/외접) 만날 수 있는 경우의 수는 1이다.
- 두 원 사이의 거리가 두 반지름의 차이보다 클 때
만날 수 있는 경우의 수는 2이다.- 두 원 사이의 거리가 두 반지름의 합보다 클 때
만날 수 있는 경우의 수는 없다.
2-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))
4. 풀이하면서 고민했던 점
-
일단 쓰면서 로직을 구현하고, 시간이 오래 걸릴것 같으면
과감히 다른 로직을 구현하자 -
알고리즘을 구현하는데 너무 시간이 오래걸린다
다른 방향으로 생각하는 것도 중요하지만, 시간을 절약하는 것도 매우 중요하다.
10분내외로 생각하고 알고리즘 구현하는 것까지 가능하도록 꾸준히 연습해보자.
- 최대한 획기적이면서 신선한 로직만이 경쟁력!
5. 참고사이트
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
5. remind
코드에 대한 이해가 우선이다. sugar syntax보다는 sugar logic!
Author And Source
이 문제에 관하여(1주차 5번(터렛)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@gyrbs22/1주차-5번터렛저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)