[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] λ””μŠ€ν¬ 컨트둀러 / 파이썬 / Python / heapq μ‚¬μš©
Algorithm/Programmers

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] λ””μŠ€ν¬ 컨트둀러 / 파이썬 / Python / heapq μ‚¬μš©

728x90
λ°˜μ‘ν˜•

 

πŸ’‘solutions )

πŸ’¬ μ°Έκ³  : λ””μŠ€ν¬ 컨트둀러 λ¬Έμ œμ—μ„œ μš”κ΅¬ν•˜λŠ” μž‘μ—…  처리 방식은 FIFO(First In First Out)κ°€ μ•„λ‹ˆλΌ SJF(Shortes Job First)방식이닀. 즉, μš”μ²­λœ μž‘μ—…λ“€ 쀑 κ°€μž₯ 짧은 μž‘μ—…μ‹œκ°„μ„ μš”κ΅¬ν•˜λŠ” μž‘μ—…λΆ€ν„° μš°μ„ μ μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” 방식이닀. -> 이런 λ°©μ‹μœΌλ‘œ μ§„ν–‰ν•˜λ©΄ 각각의 μš”μ²­λœ μž‘μ—…λ“€μ˜ λŒ€κΈ° μ‹œκ°„μ„ 쀄일 수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€. (λΉ„μ„ μ ν˜• μŠ€μΌ€μ€„λ§ λ°©μ‹μ—μ„œ 평균 λŒ€κΈ° μ‹œκ°„μ΄ κ°€μž₯ 짧닀)

 

πŸ’¬ heapq λͺ¨λ“ˆμ„ 톡해 μ΅œμ†Œ νž™ μ‚¬μš©ν•˜μ˜€μŒ -> heap에 μž‘μ—…μ˜ μ†Œμš”μ‹œκ°„, μž‘μ—…μ΄ μš”μ²­λ˜λŠ” μ‹œμ  μˆœμ„œλ‘œ 값을 λ„£μœΌλ©΄ (이번 μ˜ˆμ œμ—μ„  heap =  [[3, 0], [6, 2], [9, 1]] 순으둜 λ“€μ–΄κ°€λŠ” μ…ˆ)  -> heappopν•  λ•Œ μž‘μ—…μ˜ μ†Œμš”μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ κ°€μž₯ μž‘μ€ μ†Œμš”μ‹œκ°„μ„ 가진 κ°’(μ†Œμš”μ‹œκ°„, μž‘μ—… μš”μ²­ μ‹œμ )을 λ°˜ν™˜ν•œλ‹€.

 

πŸ’¬ μ΅œμ†Œ νž™ ꡬ쑰이기 λ•Œλ¬Έμ— 주어진 μ˜ˆμ œμ—μ„œ [0, 3]이 μ‹€ν–‰λœ ν›„ 남은 μž‘μ—… 쀑 μ†Œμš”μ‹œκ°„μ΄ 6이 κ°€μž₯ 짧기 λ•Œλ¬Έμ— [2, 6], [1, 9] μˆœμ„œλ‘œ μ‹€ν–‰λœλ‹€.

 

πŸ’¬ μž‘μ—…μ΄ μš”μ²­λ˜λŠ” μ‹œμ  κΈ°μ€€μœΌλ‘œ λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬ -> λ‚˜μ€‘μ— jobsμ—μ„œ pop()ν•  λ•Œ κ°€μž₯ λ¨Όμ € μš”μ²­λœ μž‘μ—…λ“€μ„ μš°μ„ μ μœΌλ‘œ μ°ΎκΈ° μœ„ν•¨μ΄λ‹€.

 

πŸ’¬ heappop()ν•˜λ©΄ ν•΄λ‹Ή μž‘μ—…μ΄ μ‹€ν–‰λœλ‹€λŠ” μ˜λ―Έμ΄λ―€λ‘œ  μž‘μ—…μ΄ μ‹œμž‘λ˜λŠ” μ‹œκ°„μ„ λ‚˜νƒ€λ‚΄λŠ” start와 μž‘μ—…μ΄ λλ‚˜λŠ” μ‹œκ°„μ„ λ‚˜νƒ€λ‚΄λŠ” end 그리고 ν•΄λ‹Ή μž‘μ—…μ˜ μš”μ²­λΆ€ν„° μ’…λ£ŒκΉŒμ§€ κ±Έλ¦° μ‹œκ°„μ„ ν•©ν•˜λŠ” answerκΉŒμ§€ λͺ¨λ‘ 값을 μ—…λ°μ΄νŠΈ ν•΄μ€€λ‹€.

 

πŸ‘¨‍πŸ’»code )

import heapq

def solution(jobs):
    n = len(jobs)
    start, end = 0, 0
    heap = []
    jobs.sort(key=lambda x : -x[0])
    answer = 0 
    while jobs or heap:
        while jobs and start <= jobs[-1][0] <= end:
                point, time = jobs.pop()
                heapq.heappush(heap, [time, point])
        if heap:
            time, point = heapq.heappop(heap)    
            start = end
            end += time
            answer += (end-point)
        else:
            end += 1
    return answer // n

 

πŸ“Œdescription )

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - λ””μŠ€ν¬ 컨트둀러

ν•˜λ“œλ””μŠ€ν¬λŠ” ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μž‘μ—…λ§Œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ””μŠ€ν¬ 컨트둀러λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법은 μ—¬λŸ¬ 가지가 μžˆμŠ΅λ‹ˆλ‹€. κ°€μž₯ 일반적인 방법은 μš”μ²­μ΄ λ“€μ–΄μ˜¨ μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 예λ₯Ό

programmers.co.kr


문제 μ„€λͺ…

ν•˜λ“œλ””μŠ€ν¬λŠ” ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μž‘μ—…λ§Œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ””μŠ€ν¬ 컨트둀러λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법은 μ—¬λŸ¬ 가지가 μžˆμŠ΅λ‹ˆλ‹€. κ°€μž₯ 일반적인 방법은 μš”μ²­μ΄ λ“€μ–΄μ˜¨ μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

예λ₯Όλ“€μ–΄

- 0ms μ‹œμ μ— 3msκ°€ μ†Œμš”λ˜λŠ” Aμž‘μ—… μš”μ²­ - 1ms μ‹œμ μ— 9msκ°€ μ†Œμš”λ˜λŠ” Bμž‘μ—… μš”μ²­ - 2ms μ‹œμ μ— 6msκ°€ μ†Œμš”λ˜λŠ” Cμž‘μ—… μš”μ²­

와 같은 μš”μ²­μ΄ λ“€μ–΄μ™”μŠ΅λ‹ˆλ‹€. 이λ₯Ό 그림으둜 ν‘œν˜„ν•˜λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μš”μ²­λ§Œμ„ μˆ˜ν–‰ν•  수 있기 λ•Œλ¬Έμ— 각각의 μž‘μ—…μ„ μš”μ²­λ°›μ€ μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό 같이 처리 λ©λ‹ˆλ‹€.

- A: 3ms μ‹œμ μ— μž‘μ—… μ™„λ£Œ (μš”μ²­μ—μ„œ μ’…λ£ŒκΉŒμ§€ : 3ms) - B: 1msλΆ€ν„° λŒ€κΈ°ν•˜λ‹€κ°€, 3ms μ‹œμ μ— μž‘μ—…μ„ μ‹œμž‘ν•΄μ„œ 12ms μ‹œμ μ— μž‘μ—… μ™„λ£Œ(μš”μ²­μ—μ„œ μ’…λ£ŒκΉŒμ§€ : 11ms) - C: 2msλΆ€ν„° λŒ€κΈ°ν•˜λ‹€κ°€, 12ms μ‹œμ μ— μž‘μ—…μ„ μ‹œμž‘ν•΄μ„œ 18ms μ‹œμ μ— μž‘μ—… μ™„λ£Œ(μš”μ²­μ—μ„œ μ’…λ£ŒκΉŒμ§€ : 16ms)

이 λ•Œ 각 μž‘μ—…μ˜ μš”μ²­λΆ€ν„° μ’…λ£ŒκΉŒμ§€ κ±Έλ¦° μ‹œκ°„μ˜ 평균은 10ms(= (3 + 11 + 16) / 3)κ°€ λ©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ A → C → B μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•˜λ©΄

- A: 3ms μ‹œμ μ— μž‘μ—… μ™„λ£Œ(μš”μ²­μ—μ„œ μ’…λ£ŒκΉŒμ§€ : 3ms) - C: 2msλΆ€ν„° λŒ€κΈ°ν•˜λ‹€κ°€, 3ms μ‹œμ μ— μž‘μ—…μ„ μ‹œμž‘ν•΄μ„œ 9ms μ‹œμ μ— μž‘μ—… μ™„λ£Œ(μš”μ²­μ—μ„œ μ’…λ£ŒκΉŒμ§€ : 7ms) - B: 1msλΆ€ν„° λŒ€κΈ°ν•˜λ‹€κ°€, 9ms μ‹œμ μ— μž‘μ—…μ„ μ‹œμž‘ν•΄μ„œ 18ms μ‹œμ μ— μž‘μ—… μ™„λ£Œ(μš”μ²­μ—μ„œ μ’…λ£ŒκΉŒμ§€ : 17ms)

μ΄λ ‡κ²Œ A → C → B의 μˆœμ„œλ‘œ μ²˜λ¦¬ν•˜λ©΄ 각 μž‘μ—…μ˜ μš”μ²­λΆ€ν„° μ’…λ£ŒκΉŒμ§€ κ±Έλ¦° μ‹œκ°„μ˜ 평균은 9ms(= (3 + 7 + 17) / 3)κ°€ λ©λ‹ˆλ‹€.

각 μž‘μ—…μ— λŒ€ν•΄ [μž‘μ—…μ΄ μš”μ²­λ˜λŠ” μ‹œμ , μž‘μ—…μ˜ μ†Œμš”μ‹œκ°„]을 담은 2차원 λ°°μ—΄ jobsκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μž‘μ—…μ˜ μš”μ²­λΆ€ν„° μ’…λ£ŒκΉŒμ§€ κ±Έλ¦° μ‹œκ°„μ˜ 평균을 κ°€μž₯ μ€„μ΄λŠ” λ°©λ²•μœΌλ‘œ μ²˜λ¦¬ν•˜λ©΄ 평균이 μ–Όλ§ˆκ°€ λ˜λŠ”μ§€ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”. (단, μ†Œμˆ˜μ  μ΄ν•˜μ˜ μˆ˜λŠ” λ²„λ¦½λ‹ˆλ‹€)

μ œν•œ 사항

  • jobs의 κΈΈμ΄λŠ” 1 이상 500 μ΄ν•˜μž…λ‹ˆλ‹€.
  • jobs의 각 행은 ν•˜λ‚˜μ˜ μž‘μ—…μ— λŒ€ν•œ [μž‘μ—…μ΄ μš”μ²­λ˜λŠ” μ‹œμ , μž‘μ—…μ˜ μ†Œμš”μ‹œκ°„] μž…λ‹ˆλ‹€.
  • 각 μž‘μ—…μ— λŒ€ν•΄ μž‘μ—…μ΄ μš”μ²­λ˜λŠ” μ‹œκ°„μ€ 0 이상 1,000 μ΄ν•˜μž…λ‹ˆλ‹€.
  • 각 μž‘μ—…μ— λŒ€ν•΄ μž‘μ—…μ˜ μ†Œμš”μ‹œκ°„μ€ 1 이상 1,000 μ΄ν•˜μž…λ‹ˆλ‹€.
  • ν•˜λ“œλ””μŠ€ν¬κ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³  μžˆμ§€ μ•Šμ„ λ•Œμ—λŠ” λ¨Όμ € μš”μ²­μ΄ λ“€μ–΄μ˜¨ μž‘μ—…λΆ€ν„° μ²˜λ¦¬ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

jobsreturn

[[0, 3], [1, 9], [2, 6]] 9

μž…μΆœλ ₯ 예 μ„€λͺ…

λ¬Έμ œμ— 주어진 μ˜ˆμ™€ κ°™μŠ΅λ‹ˆλ‹€.

  • 0ms μ‹œμ μ— 3ms κ±Έλ¦¬λŠ” μž‘μ—… μš”μ²­μ΄ λ“€μ–΄μ˜΅λ‹ˆλ‹€.
  • 1ms μ‹œμ μ— 9ms κ±Έλ¦¬λŠ” μž‘μ—… μš”μ²­μ΄ λ“€μ–΄μ˜΅λ‹ˆλ‹€.
  • 2ms μ‹œμ μ— 6ms κ±Έλ¦¬λŠ” μž‘μ—… μš”μ²­μ΄ λ“€μ–΄μ˜΅λ‹ˆλ‹€.



λ°˜μ‘ν˜•