Myo-Kyeong Tech Blog

[프로그래머스] Lv.0 겹치는 선분의 길이 (Python) 본문

프로그래머스

[프로그래머스] Lv.0 겹치는 선분의 길이 (Python)

myo-kyeong 2023. 7. 16. 21:06
728x90
반응형

 

코딩테스트 연습 - 겹치는 선분의 길이 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.

lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.

선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.

제한 사항

  • lines의 길이 = 3
  • lines의 원소의 길이 = 2
  • 모든 선분은 길이가 1 이상입니다.
  • lines의 원소는 [a, b] 형태이며, a, b는 각각 선분의 양 끝점 입니다.
    • -100 ≤ a < b ≤ 100

입출력 예

 


문제 풀이

  1. 선분의 시작점과 끝점을 모두 하나의 리스트에 저장. 이때 시작점과 끝점을 구분할 수 있도록 시작점은 1, 끝점은 -1로 구분
  2. x좌표에 따라 리스트 정렬
  3. 정렬된 리스트 순회
    • 만약 현재 겹치는 선분의 길이가 2 이상이면, 이전 좌표와 현재 좌표의 차를 더함 (겹치는 구간의 길이)
    • 현재 점이 시작점이면 겹치는 선분의 개수를 1증가시키고, 끝점이면 감소
  4. 두 개이상의 선분이 겹치는 부분의 길이 반환

 

def solution(lines):
    points = []
    for start, end in lines:
        points.append((start, 1))
        points.append((end, -1))
        
    points.sort()
    
    overlap = 0
    cnt = 0
    
    for i in range(len(points) - 1):
        if cnt >= 2:
            overlap += points[i][0] - points[i-1][0]
        cnt += points[i][1]
    
    return overlap
728x90
반응형