Algorithm Problem/Python

[python] λ°±μ€€ - 12764. 싸지방에 κ°„ μ€€ν•˜

deo2kim 2021. 9. 11. 10:55
λ°˜μ‘ν˜•

πŸ€”λ¬Έμ œ ν•΄κ²°

  • μš°μ„ μˆœμœ„ 큐

 

  1. λŒ€κΈ°μ€‘μΈ μ‚¬λžŒκ³Ό λ¨Όμ € μ‚¬μš©μ€‘μΈ μ‚¬λžŒ 쀑 κ°€μž₯ 빨리 λλ‚˜λŠ” κ³³κ³Ό 비ꡐ
    1. λŒ€κΈ°μ€‘μΈ μ‚¬λžŒλ³΄λ‹€ 늦게 λλ‚˜λ©΄ μƒˆλ‘œμš΄ 자리둜 λ°°μ •
    2. 기쑴의 μ‚¬λžŒμ΄ λλ‚˜λŠ” 곳이 있으면
      1. 그게 μ—¬λŸ¬ 곳이 있으면 λλ‚˜λŠ” 곳을 λ‹€ λ½‘μ•„μ„œ λ‚¨λŠ” 자리 μš°μ„ μˆœμœ„ 큐에 λ„£λŠ”λ‹€.
      2. 더 이상 없을 λ•Œ λ‚¨λŠ” 자리 μš°μ„ μˆœμœ„ νμ—μ„œ 자리λ₯΄ ν•˜λ‚˜ λ½‘μ•„μ„œ λ°°μ •ν•œλ‹€.

 

  1. μ‚¬μš©μ€‘μΈ 컴퓨터 λλ‚˜λŠ” μ‹œκ°„κ³Ό μžλ¦¬λ²ˆν˜Έκ°€ λ‹΄κΈ΄ μš°μ„ μˆœμœ„ 큐
  2. λ‚¨μ•„μžˆλŠ” μžλ¦¬κ°€ λ‹΄κΈ΄ μš°μ„ μˆœμœ„ 큐

 

μ΄λ ‡κ²Œ ν•΄μ„œ λ‘κ°œλ₯Ό μ‚¬μš©ν–ˆλ‹€.

μš°μ„ μˆœμœ„ 큐λ₯Ό λ‘κ°œ μ¨μ•Όν•΄μ„œ ν—·κ°ˆλ Έλ˜ 문제

πŸ’»μ†ŒμŠ€ μ½”λ“œ

import sys
import heapq

input = sys.stdin.readline

N = int(input())
logs = [list(map(int, input().split())) for _ in range(N)]
logs.sort()  # μ‹œμž‘μ΄ λΉ λ₯Έ 순으둜 μ •λ ¬

# 자리 카운트 μ…€ 것
use_cnt = [0] * N
use_cnt[0] = 1

# μ‚¬μš©μ€‘μΈ 컴퓨터 λλ‚˜λŠ”μ‹œκ°„κ³Ό 자리 번호
pq = []
heapq.heappush(pq, [logs[0][1], 0])  

# λ‚¨μ•„μžˆλŠ” κ°€μž₯ μžλ¦¬λ“€ ( μ•žμžλ¦¬ λ½‘μœΌλ €κ³  ) 
computers_pq = [i for i in range(N)]
heapq.heapify(computers_pq)  # 자리만
heapq.heappop(computers_pq)

for log in logs[1:]:  # 이미 λ„£μ—ˆμœΌλ‹ˆκΉŒ 1λΆ€ν„° μ‹œμž‘
    start, end = log

    if pq[0][0] > start:  # 제일빨리 λλ‚˜λŠ” 애보닀 μ‹œμž‘ μ‹œκ°„μ΄ 늦으면 남아 μžˆλŠ” λ‹€λ₯Έ 자리둜 가라
        new_posi = heapq.heappop(computers_pq)
        use_cnt[new_posi] += 1
        heapq.heappush(pq, [end, new_posi])
    else:
        while True:  # μ‚¬μš©μ€‘μΈ μžλ¦¬κ°€ μ—¬λŸ¬κ΅°λ°κ°€ λλ‚˜μžˆλŠ” κ²½μš°κ°€ μžˆλ‹€. κ·Έ μ€‘μ—μ„œ κ°€μž₯ μ•žμ„  자리λ₯Ό λ½‘μ•„μ•Όν•œλ‹€.
            prev_end, prev_seq = heapq.heappop(pq)
            if pq and pq[0][0] <= start:  # κ·Έ λ‹€μŒ 것도 이미 λλ‚˜μžˆλŠ” κ²½μš°κ°€ μžˆλ‹€.
                heapq.heappush(computers_pq, prev_seq)
                continue
            else:
                new_posi = heapq.heappushpop(computers_pq, prev_seq)
                heapq.heappush(pq, [end, new_posi])
                use_cnt[new_posi] += 1
                break

idx = N - use_cnt.count(0)
print(idx)
print(' '.join(list(map(str, use_cnt[:idx]))))

 

πŸ“•λ¬Έμ œ 확인

좜처: BACKJOON ONLINE JUDGE

 

λ°˜μ‘ν˜•