Programmers_LV0_겹치는 선분의 길이

jkky98·2023년 3월 23일
0

CodingTraining

목록 보기
20/56

문제 이해가 어려움(직접 예시들 그려볼 것!)

문제에는 선분마다 양 끝점에 대한 정보만 주어짐. 이것을 range화 시켜서 새로 변수화하고, 3개의 선분이 짝지어질 경우의 수는 3번임. 따로 함수를 제작하여 오버랩되는 구간의 리스트를 다시 뽑아 l1_l2, l2_l3, l1_l3 3개의 관계에 대한 구간 range list를 반환받음.

만약 3개의 관계 모두 겹치는 길이가 발생한다면 모두 합쳐서 최대, 최소 요소끼리 빼면 겹치는 구간의 길이를 구할 수 있음. 하지만 만약 하나의 관계라도 겹치는 길이가 발생하지 않는 다면 모두 합치면 안되고 따로따로 겹치는 구간의 길이를 계산해야 함.

문제 설명에 나온 경우와 예시 출력 3가지에 대한 경우를 모두 고려해서 코딩하면 문제없이 정답가능(문제 제출에서 1, 9번 틀린 경우는 문제 설명에 나온 경우 고려안한거임.)

def solution(lines):
    # 양 끝점 뿐만 아니라 정수기준 range화
    l1 = list(range(lines[0][0],lines[0][1]+1))
    l2 = list(range(lines[1][0],lines[1][1]+1))
    l3 = list(range(lines[2][0],lines[2][1]+1))
    
    #누가 더 긴 선분인지 파악 및 겹치는 구간 리스트로 다시 뽑기
    def length_overlap(l1,l2):
        list_tmp = []
        if len(l1) >= len(l2):
            for i in l2:
                if i in l1:
                    list_tmp.append(i)
        else:
            for i in l1:
                if i in l2:
                    list_tmp.append(i)
        if len(list_tmp) <= 1:
            list_tmp = []
        return list_tmp
    
    l1_l2 = length_overlap(l1,l2)
    l1_l3 = length_overlap(l1,l3)
    l2_l3 = length_overlap(l2,l3)

    # 세 경우 모두 겹칠 때와 아닐 때 구분하여 count(실제 겹치는 구간) 계산
    count = 0
    if len(l1_l2) == 0 or len(l1_l3) == 0 or len(l2_l3) == 0:
        for i in [l1_l2, l1_l3, l2_l3]:
            if len(i) != 0:
                count += (max(i) - min(i))
    else:
        overlap = l1_l2 + l2_l3 + l1_l3
        count = max(overlap) - min(overlap)
    
    return count
profile
a personal blog

0개의 댓글