πŸ’†πŸ»‍♂️ ν”Ό-μ—μŠ€/🐣 ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[μŠ€μœ„ν”„νŠΈ μ•Œκ³ λ¦¬μ¦˜] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€: λ””μŠ€ν¬ 컨트둀러

κ°œλ°œν•˜λŠ” ν›ˆμ΄ 2021. 9. 23. 21:45

문제

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 ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”. (단, μ†Œμˆ˜μ  μ΄ν•˜μ˜ μˆ˜λŠ” λ²„λ¦½λ‹ˆλ‹€)

풀이

운영체제λ₯Ό κ³΅λΆ€ν–ˆλ˜ μ‚¬λžŒλ“€μ—κ²ŒλŠ” μ‰½κ²Œ 이해가 λ˜μ—ˆμ„ SJF(Shortest Job First) μ•Œκ³ λ¦¬μ¦˜μ„ κ·ΈλŒ€λ‘œ κ΅¬ν˜„ν•˜λŠ” λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€. νž™μ„ μ‚¬μš©ν•œ μš°μ„ μˆœμœ„ 큐λ₯Ό μ‚¬μš©ν•˜λ©΄ 더 μ‰½κ²Œ 데이터λ₯Ό 관리할 수 μžˆκ² μ§€λ§Œ, swiftλŠ” μš°μ„ μˆœμœ„ 큐λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 정렬을 톡해 μ›ν•˜λŠ” μš°μ„ μˆœμœ„κ°€ 높은 데이터λ₯Ό λ°°μ—΄ 제일 끝으둜 λ³΄λ‚΄λŠ” 방법을 μ‚¬μš©ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 

 

μ•Œκ³ λ¦¬μ¦˜μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

1. μ²˜μŒμ—λŠ” κ°€μž₯ λ¨Όμ € λ„μ°©ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€. 

2. 이번 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λ™μ•ˆ λ„μ°©ν•˜λŠ” μž‘μ—…λ“€μ„ λ³„λ„μ˜ μž‘μ—… 큐에 λͺ¨μ€λ‹€.

3. μž‘μ—… 큐에 λ„μ°©ν•œ μž‘μ—…λ“€ 쀑 μˆ˜ν–‰μ‹œκ°„μ΄ κ°€μž₯ 짧은 μž‘μ—…μ„ κΊΌλ‚΄ μˆ˜ν–‰ν•œλ‹€. 

4. λͺ¨λ“  μž‘μ—…μ„ μ²˜λ¦¬ν•  λ•ŒκΉŒμ§€ 2, 3번 과정을 λ°˜λ³΅ν•œλ‹€.

 

그런데 μ—μ œ μΌ€μ΄μŠ€μ—μ„œλŠ” μœ„ μ•Œκ³ λ¦¬μ¦˜λŒ€λ‘œ μ²˜λ¦¬ν–ˆμ„ λ•Œ, μž‘μ•„λ‚΄μ§€ λͺ»ν•˜λŠ” μΌ€μ΄μŠ€κ°€ μžˆμŠ΅λ‹ˆλ‹€. μž‘μ—…λ“€μ΄ 연달아 λ“€μ–΄μ˜€μ§€ μ•Šκ³  쀑간에 λΉ„μ–΄μžˆλŠ” μ‹œκ°„μ΄ μžˆμ„ λ•ŒμΈλ°μš”, μ €λŠ” 이λ₯Ό μœ„ν•΄μ„œ μž‘μ—… 큐에 더 이상 μž‘μ—…μ΄ μ—†κ³ , 아직 도착해야할 μž‘μ—…λ“€μ΄ λ‚¨μ•˜λ‹€λ©΄ κ·Έ 쀑 κ°€μž₯ 빨리 λ„μ°©ν•˜λŠ” ν•˜λ‚˜μ˜ μž‘μ—…μ„ κΊΌλ‚΄ μž‘μ—… 큐둜 λ„£μ–΄μ£ΌλŠ” 방법을 μ„ νƒν–ˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ 쀑간에 μž‘μ—…μ΄ λŠκΈ°λŠ” ꡬ간이 생겨도 λ°”λ‘œ λ‹€μŒ μž‘μ—…μ„ λ°›μ•„μ„œ μ²˜λ¦¬ν•˜κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ½”λ“œ