////
Search

철로

소스코드

힙 자료구조 사용

import sys import heapq n = int(input().strip()) peoples = [] for _ in range(n): h, o = map(int, input().strip().split()) peoples.append((min(h,o), max(h,o)))) # (시작지점, 끝지점) 형태 peoples.sort(key=lambda x: x[1]) d = int(input().strip()) # 철로 선분 길이 result = 0 # 철로 선분에 모두 포함되는 사람들의 최대 수 min_heap = [] for start_point, end_point in peoples: # 철로 길이보다 두 좌표의 거리가 길면 패스 if (end_point - start_point) > d: continue heapq.heappush(min_heap, start_point) while min_heap and min_heap[0] < end_point - d: heapq.heappop(min_heap) result = max(result, len(min_heap)) print(result)
Python
복사

풀이

우선 떠올렸던 것은 이중반복문을 사용하면 안된다는 점이었습니다.
최대 O(NlogN)에서 마무리지어야 시간초과가 발생하지 않을 것이라고 판단했습니다.
입력값에 대해서는, 각 라인의 최대/최소를 찾아 튜플 형태로 (시작 좌표, 끝 좌표)를 사용했습니다.
전체 입력을 받고 나서는 끝 좌표를 기준으로 오름차순 정렬을 했습니다. 이유는 시작 좌표를 기준으로 오름차순 정렬을 시도하면 끝이 언제인지는 다시 파악을 해야하기 때문에 우선 끝 좌표로 오름차순 정렬을 하자고 생각했습니다.
최소힙을 택한 이유는, 저는 end_point를 우측 끝으로 두고 d를 왼쪽으로 보내는 느낌으로 사용했는데, 이때 최소힙에 있는 가장 왼쪽의 시작점이 end_point - d보다 왼쪽에 있다면 철로에 포함이 안되므로 매 경우 작은 값이 곧바로 나올 수 있도록 최소힙을 사용했습니다.

복기

최소힙을 사용해야하는 이유에 대해 명확히 설명해내지 못했습니다(시간복잡도나 사용 이유 등)
본능적으로 사용한 느낌?
N이 최대 10만 개인데, 순회할 생각을 안하고 다른 방식이 있나 생각해서 시간 낭비를 했습니다.
정렬을 끝점을 기준으로 사용해 끝점에서 왼쪽으로 d만큼 거리를 설정한다는, 입력값들의 점을 이용해 d만큼 범위를 설정한다는 아이디어를 떠올리지 못했습니다.
잊혀질 때쯤 다시 풀어봐야겠습니다.