11000 - (그리디, 우선순위 큐)
초기 접근
우선순위 큐 예상은 했으나
각각의 범위가 Xn-Yn 일때
가장 긴 스케쥴을 잡는 방법인, Yn의 최저에 가장 많이 붙히는 식으로 생각함
ㄴ> 다른 알고리즘임
초기 접근으로하면 한개의 스케쥴에 대해 DFS처럼 접근하게 되므로 아무리 줄이려고 해도 연산은
O(N^2)에 비례하므로 풀 수 없다.
최대힙/최소힙 등 힙을 2개를 써야하는 것을 예상은 했지만
둘다 담아놓은 상태에서 서로다른 조건의 큐를 처리를 하려고 하니 큐에
남아있는 나머지 값에 중복도 있고 조건도 중복되어 연산도 실패하고 알고리즘도 실패한다.
ㄴ>그냥 기준이 되는 Y최소힙을 비워넣기만 했으면 됐는데, 이 쉬운 생각을 왜 못했을까...
Yn이 짧은 걸 붙히는것 보다, 큐를 2개 만들고 Yn이 가장 짧은 것을 기준으로해서 그것보다 더 큰게 있으면 붙힌다
Yn중 짧은 순으로 살피고 그것보다 Yn < Xk인 k가 있는지 x에 대한 최소힙을 가지고서 판단
조건을 충족하지 않으면 그냥 그대로 y에 대한 최소힙으로 삽입
삽입해도 매번 y최소에서 기준을 뽑아서 쓰니 가장 작은 것만을 따지게 된다.
즉 매번 붙힐 수 있는게 존재하면 바로 붙힌다.
챌린징 포인트
yminq xminq둘다 값을 넣어둔 상태에서 자꾸 고려하다보니
쓰레기값을 담을 새로운 큐를 생각하였고 그것을 가지고 문제를 해결하려고 너무 복잡하게 생각하였음
ㄴ> yminq에는 빈값으로 두고 한 번씩 탐색하면서 흝으면 O(N)에 해결할 수 있다.
*미리 값을 담아두고 생각하면 복잡해진다.
기준이 될 큐는 처음부터 빈공간으로 시작해서 담는 과정에 대한 알고리즘을 구현하면 해결할 수 있다.
구현
import sys
import heapq
n = int(input())
xminq = []
for _ in range(n):
x, y = map(int,sys.stdin.readline().strip().split())
heapq.heappush(xminq, (x,y)) #정렬기준 [0]에 [1]에는 값을
###정렬 잘 되는지부터 확인하기 #y기준으로도 정렬이 잘되었는지 확인
yminq = []
while(xminq):
if yminq:
stand = heapq.heappop(yminq)
temp = heapq.heappop(xminq)
if (stand[1][1] > temp[0]):#index 다시 살피기
heapq.heappush(yminq, stand)
heapq.heappush(yminq, (temp[1],temp))
else:
heapq.heappush(yminq, (temp[1],(stand[1][0],temp[1])))
else:
temp = heapq.heappop(xminq)
heapq.heappush(yminq, (temp[1],temp))
print(len(yminq))
Author And Source
이 문제에 관하여(11000 - (그리디, 우선순위 큐)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hni1124/11000-그리디-우선순위-큐저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)