1주차 5번(터렛)

Hyo Kyun Lee·2021년 5월 28일
0
post-thumbnail

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!

0개의 댓글