1週間に5回(タレット)


1.問題リンク


https://www.acmicpc.net/problem/1002

2.試合前の計画と考え方

  • は、単純なwhile(条件)および繰返しパラメータによっては実現できない.
  • 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!