ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 37.3 심사문제: 두 점 사이의 거리 구하기
    코딩도장 심사문제모음 2020. 11. 12. 23:11
    728x90
    반응형

    표준 입력으로 x, y 좌표 4개가 입력되어 Point2D 클래스의 인스턴스 리스트에 저장됩니다. 여기서 점 4개는 첫 번째 점부터 마지막 점까지 순서대로 이어져 있습니다. 다음 소스 코드를 완성하여 첫 번째 점부터 마지막 점까지 연결된 선의 길이가 출력되게 만드세요.

    사용한 코드

    1. abs

    첫 접근 방법

    점으로 잊는 선의 길이는 해당 선을 변으로 하는 직각삼각형 대각의 길이와 같으므로

    피타고라스 정의를 이용해 접근한다.

    아래 식은 정답이 아니라고 나온다.

    width = abs(p[0].x - p[3].x)
    height = abs(p[0].y - p[3].y)
    length = math.sqrt((width**2) + (height**2))

    위 방법으로 선의 길이에 대해 접근하면, 값을 구하기 위한 조건이 필요하게 된다.

    해당 방법이아닌 반복문을 이용해 접근해보자

    풀이

     

    입력되는 4개의 점은 p 리스트안에 들어가게 된다.

    print(type(p))

     

    for 반복문을 이용해 각 점 들의 길이를 구하고, length 에 더해주면 값을 구할 수 있다.

    for i in range(len(p)-1): 
        width = abs(p[i].x - p[i+1].x)
        height = abs(p[i].y - p[i+1].y)
        c = math.sqrt((width**2) + (height**2))
        length = length + c

     여기서 비교해야하는 경우의수를 고려하여 lenp -1 즉 0 , 1, 2 까지만 비교한다.

    맨 마지막 3인덱스는 비교 하지 않는다.

    가로와 높이를 각각 절대값으로 구해주며

    c제곱근을 구한후 해당 값을 length에 계속 더해주면된다.

    import math
     
    class Point2D:
        def __init__(self, x=0, y=0):
            self.x = x
            self.y = y
     
    length = 0.0
    p = [Point2D(), Point2D(), Point2D(), Point2D()]
    p[0].x, p[0].y, p[1].x, p[1].y, p[2].x, p[2].y, p[3].x, p[3].y = map(int, input().split())
    
    for i in range(len(p)-1): 
        width = abs(p[i].x - p[i+1].x)
        height = abs(p[i].y - p[i+1].y)
        c = math.sqrt((width**2) + (height**2))
        length = length + c
        
    print(length)
    #
    42.42640687119285
    

     

     

    해당 문제에서 의문점이 있다.

    예를 들어 첫번째 점과 네번째 점만을 이용하여 길이를 구할 경우

    입력되는 네 가지의 점들이 오름차순으로 순서있게 입력이 되야 가능하다

    실제로

    10 10 20 20 30 30 40 40 에서는 정상 동작하나

    40 40 10 10 20 20 30 30 에서는 40과 30만을 이용한 선의 길이가 출력된다.

     

    10 10 20 20 30 30 40 40 

    이렇게 오름차순으로 모양이쁘게 입력되는게 아닌

    30 30 20 20 40 40 10 10 이렇게 입력할 경우 선의 길이 총 길이를 알면되는데

    값이 계속 더해져 엉뚱한 값이 나오게 된다.

    if 문, bool 을 이용해 접근하려 보았지만 코드가 엄청 길어질뿐더러 값도 나오지 않는다.

    기회가 된다면 추후 순차적으로 입력되지 않아도 값이 같게 나올 수 있도록 코딩해보는것도 좋은것 같다.

    ※ 실제 코딩 도장의 해법과 다를  수 있으며, 답은 여러가지가 존재합니다.

    코드 지적 정말 감사히 받겠습니다.

     

     

     

    728x90
    반응형
Designed by Tistory.