백준 온라인 저지, 그리디 / 1689번: 겹치는선분 (파이썬 / 백준 골드문제)
2021. 9. 3. 00:12ㆍ알고리즘/그리디
728x90
반응형
문제
https://www.acmicpc.net/problem/1689문제 정의
1차원 좌표계 위에 선분 N개가 있다. 선분이 최대로 겹쳐있는 부분의 겹친 선분의 개수를 구해보자. 선분의 끝 점에서 겹치는 것은 겹치는 것으로 세지 않는다.
입력
첫째 줄에는 선분의 개수(1 ≤ N ≤ 1,000,000)가 입력으로 들어온다. 그 다음 N개의 줄에 선분의 시작 좌표와 끝나는 좌표가 입력으로 들어온다. 선분의 좌표는 절댓값이 10억보다 작거나 같은 정수이다.
출력
첫째 줄에는 최대로 많이 겹치는 선분들의 개수를 출력한다.
예제 입력 1
11 1 2 3 6 7 8 10 11 13 16 0 5 5 6 2 5 6 10 9 14 12 15
예제 출력 1
3
접근 방법
- 선분을 입력받은 뒤 선분의 왼쪽 좌표를 기준으로 오름차순 정렬하고 첫번째 인덱스에 있는 오른쪽 좌표를 min heap에 저장한다.
- 이후 선분을 하나씩 탐색하며 탐색중인 선분의 왼쪽 좌표와 min heap에 저장된 오른쪽 좌표를 비교해 왼쪽좌표보다 낮은거는 모두 삭제한다.
- 삭제가 끝나면 현재 탐색중인 선분의 오른쪽 좌표를 min heap에 삽입한 뒤 결과 값에 결과값과 길이 중 더 높은 숫자를 저장한다.
- 모든 탐색이 끝난 뒤 결과값을 출력한다.
코드
# 접근 방법
# 선분을 입력받은 뒤 선분의 왼쪽 좌표를 기준으로 오름차순 정렬하고 첫번째 인덱스에 있는 오른쪽 좌표를 min heap에 저장한다.
# 이후 선분을 하나씩 탐색하며 탐색중인 선분의 왼쪽 좌표와 min heap에 저장된 오른쪽 좌표를 비교해 왼쪽좌표보다 낮은거는 모두 삭제한다.
# 삭제가 끝나면 현재 탐색중인 선분의 오른쪽 좌표를 min heap에 삽입한 뒤 결과 값에 결과값과 길이 중 더 높은 숫자를 저장한다.
# 모든 탐색이 끝난 뒤 결과값을 출력한다.
import sys, heapq
input = sys.stdin.readline
n = int(input())
array = [tuple(map(int, input().split())) for _ in range(n)]
array.sort(key=lambda x:x[0])
min_heap = []
heapq.heappush(min_heap, array[0][1])
result = 1
for x in array[1:]:
while min_heap and min_heap[0] <= x[0]:
heapq.heappop(min_heap)
heapq.heappush(min_heap, x[1])
result = max(result, len(min_heap))
print(result)
728x90
반응형
'알고리즘 > 그리디' 카테고리의 다른 글
백준 온라인 저지, 그리디 / 2170번: 선긋기 (파이썬 / 백준 골드문제) (0) | 2021.09.07 |
---|---|
백준 온라인 저지, 그리디 / 1107번: 리모컨 (파이썬 / 백준 골드문제) (0) | 2021.09.03 |
백준 온라인 저지, 그리디 / 1461번: 도서관 (파이썬 / 백준 골드문제) (0) | 2021.09.01 |
백준 온라인 저지, 그리디 / 13904번: 과제 (파이썬 / 백준 골드문제) (0) | 2021.09.01 |
백준 온라인 저지, 그리디 / 17619번: 개구리점프 (파이썬 / 백준 골드문제) (0) | 2021.08.30 |