deo2kim
λ§žμ™œν‹€
deo2kim
전체 방문자
였늘
μ–΄μ œ
  • λΆ„λ₯˜ 전체보기
    • CS
      • Algorithm
      • Data Structure
      • Network
      • DB
      • OS
    • Algorithm Problem
      • Python
      • JavaScript
    • Programming language
      • Python
      • JavaScript
    • Tool
      • Jquery
      • React
    • 개발
    • Infra

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ
  • νƒœκ·Έ
  • λ°©λͺ…둝

곡지사항

인기 κΈ€

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

λ°˜μ‘ν˜•
hELLO Β· Designed By μ •μƒμš°.
deo2kim

λ§žμ™œν‹€

[python] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - λ””μŠ€ν¬ 컨트둀러
Algorithm Problem/Python

[python] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - λ””μŠ€ν¬ 컨트둀러

2020. 9. 10. 08:19
λ°˜μ‘ν˜•

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

Lv3 | μš°μ„ μˆœμœ„ 큐

νŒŒμ΄μ¬μ—μ„œλŠ”  heapq  λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

 

λ¨Όμ € ν˜„μž¬ μ‹œκ°„μ„ 항상 계산해 μ€λ‹ˆλ‹€.

ν˜„μž¬ μ‹œκ°„λ³΄λ‹€ νˆ¬μž…μ‹œκ°„μ΄ μž‘μ€ μž‘μ—…λ“€μ„ νž™νμ— λ„£μ–΄μ€λ‹ˆλ‹€.

 

νž™νμ— 값이 μ—¬λŸ¬κ°œ λ“€μ–΄μžˆλ”λΌλ„,  heappop()  을 ν•˜κ²Œ 되면 μž‘μ—…μ‹œκ°„μ΄ κ°€μž₯ 짧은 μž‘μ—…μ΄ λ‚˜μ˜€κ²Œ λ©λ‹ˆλ‹€.

( νž™νμ—μ„œλŠ” μ΅œμ†Ÿκ°’μ΄ λ‚˜μ˜€κ²Œ λ©λ‹ˆλ‹€ )

 

μž‘μ—…μ‹œκ°„λ§ŒνΌ  ν˜„μž¬μ‹œκ°„ 을 늘렀주고, ν•΄λ‹Ή μž‘μ—…μ˜  λŒ€κΈ°μ‹œκ°„+μž‘μ—…μ‹œκ°„ 을 λ”°λ‘œ μ €μž₯ν•΄ λ‘‘λ‹ˆλ‹€.

 

ν•œ μž‘μ—…μ΄ λλ‚˜κ³  λ‚˜λ©΄ μ‹œκ°„μ΄ ν˜λ €κΈ° λ•Œλ¬Έμ—

λ‹€μ‹œ ν˜„μž¬ μ‹œκ°„λ³΄λ‹€ νˆ¬μž…μ‹œκ°„μ΄ μž‘μ€ μž‘μ—…λ“€μ„ νž™νμ— λ„£μ–΄μ€λ‹ˆλ‹€.(μ•„κΉŒ 넣은 μž‘μ—… μ œμ™Έ)

 

λ˜‘κ°™μ΄ heappop() 으둜 ν˜„μž¬μ‹œκ°„κ³Ό μž‘μ—…μ‹œκ°„μ„ μ €μž₯ν•©λ‹ˆλ‹€.

 

πŸ’¨ μ—…λ¬΄νˆ¬μž…μ‹œκ°„μ΄ μ˜€λ¦„μ°¨μˆœ 정렬이 μ•ˆλ˜μ–΄μžˆμ–΄μ„œ λ¨Όμ € 정렬을 ν•΄μ€˜μ•Ό ν•©λ‹ˆλ‹€.

 

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

import heapq


def solution(jobs):
    cur_sec = 0  # ν˜„μž¬μ‹œκ°„
    pq = []  # ν˜„μž¬ μ‹œκ°„μ— μž‘μ—… λŒ€κΈ°μ€‘μΈ work
    result = []  # 각각의 work λ‹Ή μž‘μ—… μ‹œκ°„μ„ μ €μž₯
    jobs.sort()  # μž‘μ—… νˆ¬μž… μ‹œκ°„μ΄ 적은 μˆœμ„œλŒ€λ‘œ μ •λ ¬
    length_jobs = len(jobs)
    idx = 0  # μž‘μ—… νˆ¬μž… 개수

    while idx < length_jobs or pq:  # μž‘μ—…μ— λͺ¨λ‘ νˆ¬μž…ν•˜κ³  λŒ€κΈ°μ€‘μΈ μž‘μ—…λ„ μ—†μœΌλ©΄ μ’…λ£Œ
        for i in range(idx, len(jobs)):
            if jobs[i][0] <= cur_sec:  # μž‘μ—…μ— νˆ¬μž…ν•  μ‹œκ°„μ΄ ν˜„μž¬μ‹œκ°„λ³΄λ‹€ 적으면 νˆ¬μž…!!
                # νž™νλ₯Ό μ“°κΈ° μœ„ν•΄ μž‘μ—…μ‹œκ°„κ³Ό νˆ¬μž…μ‹œκ°„μ˜ μˆœμ„œλ₯Ό λ°”κΏ”μ„œ λ„£μ–΄μ€Œ
                heapq.heappush(pq, [jobs[i][1], jobs[i][0]])
            else:
                idx = i
                break
        else:
            idx = i + 1
        # print('λŒ€κΈ°μ€‘μΈ μž‘μ—…: ', pq)

        if pq:
            # μž‘μ—…μ‹œκ°„, νˆ¬μž…μ‹œκ°„
            work_sec, enter_sec = heapq.heappop(pq)
            # cur_sec-enter_sec: λŒ€κΈ°μ‹œκ°„
            result.append(work_sec+cur_sec-enter_sec)
            # μž‘μ—…μ‹œκ°„λ§ŒνΌ ν˜„μž¬μ‹œκ°„ ++
            cur_sec += work_sec

        else:
            cur_sec += 1

    # κ²°κ³Ό
    answer = sum(result) // length_jobs
    return answer

 

πŸ“•λ¬Έμ œ 확인

좜처: ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

링크: https://programmers.co.kr/learn/courses/30/lessons/42627

 

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

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

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 κ±Έλ¦¬λŠ” μž‘μ—… μš”μ²­μ΄ λ“€μ–΄μ˜΅λ‹ˆλ‹€.
λ°˜μ‘ν˜•
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€ (μƒˆμ°½μ—΄λ¦Ό)

'Algorithm Problem > Python' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[python] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - μ•Όκ·Ό μ§€μˆ˜  (0) 2020.09.11
[python] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - μΏ ν‚€ κ΅¬μž…  (0) 2020.09.10
[python] λ°±μ€€ - 2343. 기타 레슨  (5) 2020.09.09
[python] λ°±μ€€ - 1926. κ·Έλ¦Ό  (0) 2020.09.08
[python] λ°±μ€€ - 1743. μŒμ‹λ¬Ό ν”Όν•˜κΈ°  (0) 2020.09.07
    'Algorithm Problem/Python' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [python] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - μ•Όκ·Ό μ§€μˆ˜
    • [python] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - μΏ ν‚€ κ΅¬μž…
    • [python] λ°±μ€€ - 2343. 기타 레슨
    • [python] λ°±μ€€ - 1926. κ·Έλ¦Ό
    deo2kim
    deo2kim
    μ½”λ”© κΈ°λ‘ν•˜κΈ°

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”