From 282470405345cb9f3de1827b4eb84ea502264627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9E=84=EC=A7=80=EC=88=98?= Date: Wed, 13 Sep 2023 15:00:35 +0900 Subject: [PATCH 1/2] =?UTF-8?q?Create=20=EA=B0=95=EC=9D=98=EC=8B=A4=20?= =?UTF-8?q?=EB=B0=B0=EC=A0=95=20jisu.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jisu.py" | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 "BOJ/\352\260\225\354\235\230\354\213\244 \353\260\260\354\240\225/jisu.py" diff --git "a/BOJ/\352\260\225\354\235\230\354\213\244 \353\260\260\354\240\225/jisu.py" "b/BOJ/\352\260\225\354\235\230\354\213\244 \353\260\260\354\240\225/jisu.py" new file mode 100644 index 00000000..3a86f0dd --- /dev/null +++ "b/BOJ/\352\260\225\354\235\230\354\213\244 \353\260\260\354\240\225/jisu.py" @@ -0,0 +1,40 @@ +""" +풀이 시작 : 2023-09-13 13:44 + +#### 제한 사항 +- N <= 200,000 이므로, O(NlogN) 알고리즘을 설계해야 한다. + +#### 풀이 +- 일단 강의 시작 순서대로 주어진다는 조건이 없으므로 정렬 O(NlogN) +- 모든 배치된 강의실 중 가장 빨리 끝나는 강의실보다 현재 진행되어야 하는 강의가 더 빠르면 강의실을 추가해야 함 + - 강의가 끝나는 시간을 담은 heap으로 강의실 배정 리스트를 관리한다. + - 모든 강의를 순회하며 해당 강의의 시작하는 시간이 가장 빨리 끝나는 강의실(heap의 root)의 끝나는 시간보다 더 빠른지 체크 + - 더 빠르다면 힙에 해당 강의의 끝나는 시간 삽입 : 강의실을 추가한다는 의미 + - 가장 빨리 끝나는 강의실의 강의가 더 빨리 끝난다면 heappop 후, 삽입 : 해당 강의실에 강의를 교체한다는 의미 + - 순회 : O(N), heappush: O(logN) -> O(NlogN) +- 최종적으로 O(2NlogN)으로 풀이 가능 + +풀이 완료 : 2023-09-13 14:50 (1시간 6분 소요) +""" + +import sys +from heapq import heappush, heappop + + +input = sys.stdin.readline + +N = int(input()) + +classes = sorted( + list(tuple(map(int, input().rstrip().split())) for _ in range(N)) +) # 시작 시간 기준으로 정렬 +assigned = [] # min heap으로 사용 + +for st, en in classes: + if not assigned or assigned[0] > st: + heappush(assigned, en) + else: + heappop(assigned) + heappush(assigned, en) + +print(len(assigned)) From 9ccb63081d6ab564ee6274eacdef0151ced0e9c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9E=84=EC=A7=80=EC=88=98?= Date: Wed, 13 Sep 2023 22:47:55 +0900 Subject: [PATCH 2/2] chore : add notation --- .../jisu.py" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/BOJ/\352\260\225\354\235\230\354\213\244 \353\260\260\354\240\225/jisu.py" "b/BOJ/\352\260\225\354\235\230\354\213\244 \353\260\260\354\240\225/jisu.py" index 3a86f0dd..0d25e749 100644 --- "a/BOJ/\352\260\225\354\235\230\354\213\244 \353\260\260\354\240\225/jisu.py" +++ "b/BOJ/\352\260\225\354\235\230\354\213\244 \353\260\260\354\240\225/jisu.py" @@ -31,10 +31,10 @@ assigned = [] # min heap으로 사용 for st, en in classes: - if not assigned or assigned[0] > st: - heappush(assigned, en) - else: - heappop(assigned) - heappush(assigned, en) + if not assigned or assigned[0] > st: # 가장 빨리 끝나는 강의의 끝나는 시간보다 현재 강의 시작이 빠름 + heappush(assigned, en) # 그럼 강의실 추가해야 됨 + else: # 아니면 + heappop(assigned) # 기존 강의 끝내고 + heappush(assigned, en) # 현재 강의 배정 -print(len(assigned)) +print(len(assigned)) # 최종 배정한 강의실 개수 반환