프로그래머스 120876번 문제인 "겹치는 선분의 길이" Lv.0을 파이썬으로 풀어보도록 하겠습니다.
[프로그래머스] 겹치는 선분의 길이 Lv.0 - [파이썬/python]
💻 문제 설명
선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines
가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 반환(return) 하도록 solution 함수를 완성해보세요.
lines
가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.
선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.
🚨 제한사항
lines
의 길이 = 3lines
의 원소의 길이 = 2- 모든 선분은 길이가 1 이상입니다.
lines
의 원소는 [a, b] 형태이며, a, b는 각각 선분의 양 끝점 입니다.- -100 ≤ a < b ≤ 100
🌟 소스 코드
def solution(lines):
# 각 선분의 시작점과 끝점을 point로 만들어 리스트에 저장
points = []
for start, end in lines:
points.append((start, 'start')) # 선분의 시작점을 'start' 타입의 point로 추가
points.append((end, 'end')) # 선분의 끝점을 'end' 타입의 point로 추가
points.sort() # 모든 point를 오름차순 정렬
overlap_length = 0 # 겹치는 선분의 길이를 저장하는 변수
overlap_count = 0 # 현재 겹치는 선분의 수를 저장하는 변수
prev_point = None # 이전 포인트의 시간을 저장하는 변수
# 모든 point를 순회
for point, point_type in points:
# 현재 겹치는 선분의 수가 2 이상이고 이전 point가 있으면,
if overlap_count >= 2 and prev_point is not None:
# 겹치는 선분의 길이에 (현재 point - 이전 point) 추가
overlap_length += point - prev_point
# point_type이 'start'이면 '겹치는 선분의 수'를 증가시키고, 'end'이면 감소
if point_type == 'start':
overlap_count += 1
elif point_type == 'end':
overlap_count -= 1
# 현재 포인트(point)를 이전 포인트(pre_point)에 저장
prev_point = point
return overlap_length
⏱ 시간복잡도
위 코드의 시간 복잡도는 O(n log n)입니다.
- 정렬: points.sort()
선분의 시작점과 끝점을 정렬하는 데 O(n log n)의 시간이 소요됩니다. 정렬은 일반적으로 O(n log n)의 시간 복잡도를 가집니다.
- 루프: for point, point_type in points
모든 포인트를 순회하는 데 O(n)의 시간이 소요됩니다.
따라서, 전체 시간 복잡도는 정렬에 소요되는 시간(O(n log n))과 루프에 소요되는 시간(O(n))을 합한 것이므로, 최종적으로 O(n log n)이 됩니다.
이 방법은 모든 선분을 한 번씩 검사하므로, 선분의 수가 많아도 효율적으로 동작합니다.
🏳🌈 테스트 결과
728x90
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 주사위 게임 3 - Lv.0 (52) | 2023.10.25 |
---|---|
[프로그래머스] 다음 큰 숫자 - Lv.2 (59) | 2023.10.21 |
[프로그래머스] 튜플 - Lv.2 (54) | 2023.10.14 |
[프로그래머스] 문자열 곱하기 - Lv.0 (53) | 2023.10.14 |
[프로그래머스] 나누어 떨어지는 숫자 배열 - Lv.1 (55) | 2023.10.14 |