Potato
μ•ˆλ…•ν•˜μ„Έμš”, κ°μž‘λ‹ˆλ‹€?πŸ₯” ^___^ 😺 github λ°”λ‘œκ°€κΈ° πŸ‘‰πŸ»

Algorithm/Programmers

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] (Swift) λ””μŠ€ν¬μ»¨νŠΈλ‘€λŸ¬ (Lv.3) (feat. 운영체제의 SFJ μŠ€μΌ€μ€„λ§ μ•Œκ³ λ¦¬μ¦˜)

감자 πŸ₯” 2022. 9. 21. 22:02
λ°˜μ‘ν˜•

🟠 TIL - μ˜€λŠ˜μ€ 무엇을 λ°°μ› λ‚˜μš”!

πŸ“ μš΄μ˜μ²΄μ œμ˜ SFJ μ•Œκ³ λ¦¬μ¦˜ (μ΅œμ†Œ μž‘μ—… μš°μ„  μŠ€μΌ€μ€„λ§)

μ΅œμ†Œ μž‘μ—… μš°μ„  μŠ€μΌ€μ€„λ§ μ΄λž€, 각 μž‘μ—…μ˜ ν”„λ‘œμ„Έμ„œ μ‹€ν–‰ μ‹œκ°„μ„ μ΄μš©ν•˜μ—¬ ν”„λ‘œμ„Έμ„œκ°€ μ‚¬μš© κ°€λŠ₯ν•  λ•Œ μ‹€ν–‰μ‹œκ°„μ΄ κ°€μž₯ 짧은 μž‘μ—…μ— ν• λ‹Ήν•˜λŠ” 방법
  • 항상 μ‹€ν–‰μ‹œκ°„μ΄ 짧은 것뢀터 μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ—, 평균 λŒ€κΈ°μ‹œκ°„μ΄ 쀄어든닀.

ν•΄λ‹Ή λ¬Έμ œλŠ” 비선점 μŠ€μΌ€μ€„λ§ 방식이닀. 비선점 SFJ μŠ€μΌ€μ€„λ§ 방법을 μ‚΄νŽ΄λ³΄μž.

https://wonit.tistory.com/104

  • p1은 전에 아무 ν”„λ‘œμ„ΈμŠ€κ°€ μ—†κΈ° λ•Œλ¬Έμ— λ°”λ‘œ μ‹€ν–‰ν•œλ‹€.
  • p1의 μ‹€ν–‰ μ‹œκ°„μ΄ 1μΌλ•Œ, 2μΌλ•Œ, 3μΌλ•Œ, 4μΌλ•Œ 각각 p2, p3, p4, p5κ°€ λ“€μ–΄μ˜¨λ‹€.
  • 각각의 ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰ μ‹œκ°„μ„ λΉ„κ΅ν•˜μ—¬ κ°€μž₯ 짧은 ν”„λ‘œμ„ΈμŠ€ p4λ₯Ό μΈμ§€ν•˜κ³  p4λ₯Ό μ‹€ν–‰ μ‹œν‚¨λ‹€.
  • p4의 싀행이 λλ‚˜κ³  λ‚˜μ„œ κ·Έ λ‹€μŒμ˜ μ‹€ν–‰ μ‹œκ°„μ΄ 짧은 p3λ₯Ό μ‹€ν–‰μ‹œν‚¨λ‹€.
  • p3의 싀행이 λλ‚˜κ³  κ·Έ λ‹€μŒ μ‹€ν–‰ μ‹œκ°„μ΄ 짧은 p5λ₯Ό μ‹€ν–‰ μ‹œν‚¨λ‹€.
  • p5의 싀행이 λλ‚˜κ³  κ·Έ λ‹€μŒ μ‹€ν–‰ μ‹œκ°„μ΄ 짧은 p2λ₯Ό μ‹€ν–‰ μ‹œν‚¨λ‹€.

이런 λ°©μ‹μœΌλ‘œ μ§„ν–‰λ˜λ©°, μ•„λž˜ λ¬Έμ œμ™€ λ™μΌν•œ 방식이닀. κ·ΈλŒ€λ‘œ μ½”λ“œλ‘œ κ΅¬ν˜„ν•˜λ©΄ λ˜λŠ” λ¬Έμ œμ˜€λ‹€. (λ‚˜λŠ” 말이 μž₯ν™©ν•˜κ²Œ λ˜μ–΄μžˆκ³ , SFJλ₯Ό λͺ°λžμ–΄μ„œ 문제λ₯Ό μ΄ν•΄ν•˜λŠ”λ° 쑰금 κ±Έλ Έλ‹€ γ… γ…  μ—­μ‹œ 운영체제 μ€‘μš”ν•΄...✨)

https://wonit.tistory.com/104
https://wonit.tistory.com/104

πŸ’‘ λ°˜ν™˜μ‹œκ°„ = μœ„ μ°¨νŠΈμ— μ‹€ν–‰ μˆœμ„œμ— λ”°λ₯Έ μ‹€ν–‰ μ‹œκ°„ + λŒ€κΈ°μ‹œκ°„
πŸ’‘ λŒ€κΈ°μ‹œκ°„ = λ°˜ν™˜μ‹œκ°„ - μ‹€ν–‰μ‹œκ°„

 

μ΄λ ‡κ²Œ κ²°κ³Όκ°€ λ‚˜μ˜€κ²Œ λœλ‹€.

이제 선점 μŠ€μΌ€μ₯΄λ§ 방식을 κ°„λ‹¨ν•˜κ²Œ μ•Œμ•„λ³΄μž.

https://wonit.tistory.com/104

  • p1은 아무 ν”„λ‘œμ„ΈμŠ€κ°€ μ—†κΈ° λ•Œλ¬Έμ— λ°”λ‘œ μ‹€ν–‰λœλ‹€.
  • μ‹œκ°„μ΄ 흐λ₯΄κ³  μ‹€ν–‰ μ‹œκ°„μ΄ 1μΌλ•Œ p2κ°€ λ“€μ–΄μ˜€λŠ”λ°, p2의 μ‹€ν–‰ μ‹œκ°„(28)보닀 p1의 μ‹€ν–‰ μ‹œκ°„(10-1=9)κ°€ 더 짧기 λ•Œλ¬Έμ— 계속 μ§„ν–‰ν•œλ‹€.
  • 또 μ‹œκ°„μ΄ 흐λ₯΄κ³  μ‹€ν–‰ μ‹œκ°„ 2일 λ•Œ p3κ°€ λ“€μ–΄μ˜€λŠ”λ° p1의 μ‹€ν–‰ μ‹œκ°„(10-2=8)보닀 p3의 μ‹€ν–‰ μ‹œκ°„(6)이 더 짧기 λ•Œλ¬Έμ— p1의 싀행을 μž μ‹œ μ€‘λ‹¨ν•˜κ³  p3λ₯Ό μ‹€ν–‰μ‹œν‚¨λ‹€.
  • μ‹œκ°„μ΄ 흐λ₯΄κ³  μ‹€ν–‰ μ‹œκ°„ 3μΌλ•Œ p4κ°€ λ“€μ–΄μ˜€λŠ”λ° p3의 μ‹€ν–‰ μ‹œκ°„(6-1=5)보닀 p4의 μ‹€ν–‰ μ‹œκ°„(4)κ°€ 더 짧기 λ•Œλ¬Έμ— p3λ₯Ό μž μ‹œ μ€‘λ‹¨μ‹œν‚€κ³  p4λ₯Ό μ‹€ν–‰ μ‹œν‚¨λ‹€.
  • μ‹œκ°„μ΄ 흐λ₯΄κ³  μ‹€ν–‰ μ‹œκ°„μ΄ 4일 λ•Œ p5κ°€ λ“€μ–΄μ˜€λŠ”λ°, p4의 μ‹€ν–‰ μ‹œκ°„(4-1=3) 보닀 p5의 μ‹€ν–‰ μ‹œκ°„(14)이 κΈΈκΈ° λ•Œλ¬Έμ— p4λ₯Ό κ·ΈλŒ€λ‘œ μœ μ§€μ‹œν‚¨λ‹€.
  • μ‹œκ°„μ΄ 흐λ₯΄κ³  μ‹€ν–‰ μ‹œκ°„μ΄ 7일 λ•Œ p4의 싀행을 끝내고 κ·Έ λ‹€μŒμœΌλ‘œ 짧은 p3λ₯Ό μ‹€ν–‰μ‹œν‚¨λ‹€.
  • (반볡)

κ²°κ΅­μ—” μ΄λŸ¬ν•œ κ°„νŠΈμ°¨νŠΈκ°€ λ‚˜μ˜¨λ‹€.

 

🟠 문제 링크

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

 

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

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”.

programmers.co.kr

 

 

🟠 문제 풀이

사싀 μ²˜μŒμ— 보고 'νž™'μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λΌκ³  ν•΄μ„œ 쑰금 ν—€λ§Έλ‹€. νž™μ€ μŠ€μœ„ν”„νŠΈμ—μ„œ μ§€μ›ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ–΄λ–»κ²Œ κ΅¬ν˜„ν•΄μ•Όν• μ§€ λ§‰λ§‰ν–ˆκ³ , λ„λŒ€μ²΄ 이게 μ™œ ... νž™μ„ μ‚¬μš©ν•΄μ•Όν•˜λŠ”μ§€ λͺ°λžλ‹€ γ… γ…  (SFJμ•Œκ³ λ¦¬μ¦˜μ„ λͺ°λžλ‹€,,)

νž™μ„ μ‚¬μš©ν•΄μ•Όν•˜λŠ” μ΄μœ λŠ”, python을 예λ₯Ό λ“€λ©΄, heap 에 μ €μž₯ν•˜λ©΄, μž‘μ€ μˆœμ„œλŒ€λ‘œ heap 내뢀에 정렬이 되고, heappop을 ν•˜κ²Œ 되면 μžλ™μœΌλ‘œ κ°€μž₯ μž‘μ€ μˆ˜κ°€ Popλœλ‹€κ³  ν•œλ‹€.

ν•΄λ‹Ή λ¬Έμ œλŠ”, 'μž‘μ—… μ†Œμš” μ‹œκ°„'이 μž‘μ€ μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•˜λŠ” 것이 ν•΅μ‹¬μ΄μ—ˆμœΌλ―€λ‘œ, νž™μ„ μ‚¬μš©ν•˜λ©΄ λœλ‹€κ³  μ–ΈκΈ‰λœ 것이닀.

그럼 μ™œ μž‘μ—…μ†Œμš”μ‹œκ°„μ΄ μž‘μ€ μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•΄μ•Όν•˜λŠ”κ°€?

μ†Œμš”μ‹œκ°„μ΄ 짧은 μˆœμ„œλŒ€λ‘œ μ§„ν–‰ν•˜κ²Œλ˜λ©΄, 평균 λŒ€κΈ°μ‹œκ°„μ΄ 쀄어듀기 λ•Œλ¬Έμ΄λΌκ³  ν•œλ‹€. μ΄λŠ” μœ„μ— TIL νŒŒνŠΈμ—μ„œ 더 μžμ„Έν•œ μ„€λͺ…이 될 것이닀.

κ·Έλž˜μ„œ λ¬Έμ œλŠ” μ•„λž˜μ™€ 같이 ν’€μ—ˆλ‹€. μŠ€μœ„ν”„νŠΈμ—μ„œλŠ” νž™μ΄ μ—†μœΌλ―€λ‘œ 정렬을 잘 ν•΄μ£ΌλŠ”κ²Œ ν¬μΈνŠΈμ˜€λ‹€. 그리고 λ”λΆˆμ–΄μ„œ, λλ‚˜λŠ” μ‹œκ°„μ€ ν•­μƒλ‹¬λΌμ§€λŠ”λ°, μ‹œμž‘μ‹œκ°„ κ°€λŠ₯ μ‹œκ°„μ€ 항상 κ°™λ‹€. κ·Έλž˜μ„œ 'μ‹œμž‘μ‹œκ°„μ΄ λΉ λ₯Έ μˆœμ„œλŒ€λ‘œ', 'μ‹œμž‘μ‹œκ°„μ΄ κ°™λ‹€λ©΄ μ†Œμš”μ‹œκ°„μ΄ μž‘μ€μˆœμ„œλŒ€λ‘œ' μ •λ ¬ν•΄μ£Όμ—ˆλ‹€.

  1. λ‘λ²ˆμ˜ μ •λ ¬ 과정을 κ±°μΉœλ‹€.
  2. 그리고 ν˜„μž¬μ‹œμ μ„ μ €μž₯ν•  λ³€μˆ˜ now, λŒ€κΈ°μ‹œκ°„κ³Ό μ†Œμš”μ‹œκ°„μ„ λͺ¨λ‘ ν•©μΉœ κ²°κ³Όλ₯Ό 담을 totalTime λ³€μˆ˜λ₯Ό λ§Œλ“€μ—ˆλ‹€.
  3. μ •λ ¬λœ jobs λ°°μ—΄μ—μ„œ remove ν•˜λ©΄μ„œ 진행할 것이기 λ•Œλ¬Έμ— (pythonμ—μ„œλŠ” heappop) jobs배열이 μ•„μ˜ˆ μ—†μ–΄μ§ˆλ•ŒκΉŒμ§€ λ°˜λ³΅ν•˜κΈ°μœ„ν•΄μ„œ while문을 μ‚¬μš©ν•œλ‹€.
  4. κ·Έ μ•ˆμ—μ„œ for문을 μ΄μš©ν•΄μ„œ λ‚΄λΆ€μ—μ„œ λ‹Ήμž₯ 더할 수 μžˆλŠ” μž‘μ—…λ“€μ„ 찾을 것이닀.
  5. checkλΌλŠ” λ³€μˆ˜λŠ”, μž‘μ—…μ„ 마친 μ‹œκ°„ nowκ°€, μž‘μ—… μš”μ²­μ‹œκ°„λ³΄λ‹€ μž‘μ„ κ²½μš°μ— ν•„μš”ν•΄μ„œ λ„£μ—ˆλ‹€. check κ°€ true둜 λ°”λ€Œμ§€ μ•ŠλŠ”λ‹€λ©΄,ν˜„μž¬ μš”μ³₯된 μž‘μ—…μ„ μ‹œμž‘ν•  μ‹œκ°„μ΄ 아직 λ˜μ§€ μ•Šμ•˜λ‹€λŠ” λœ»μ΄λ―€λ‘œ, now에 +1 μ”© ν•΄μ€€λ‹€.

μœ„ 과정을 μƒκ°ν•˜λŠ”λ° 쑰금 μ‹œκ°„μ΄ κ±Έλ Έλ‹€. κ·Έλž˜μ„œ μ•„μ΄νŒ¨λ“œλ‘œ μ°¨κ·Όμ°¨κ·Ό κ·Έλ €λ‚˜κ°€λ©΄μ„œ 문제λ₯Ό ν’€μ—ˆλ‹€. (사싀 인터넷도 쑰금 μ°Έκ³ ;; )

 

🟠 μ •λ‹΅μ½”λ“œ

https://github.com/deslog/Algorithm/blob/main/Algorithm/Programmers/λ””μŠ€ν¬μ»¨νŠΈλ‘€λŸ¬/main.swift

 

GitHub - deslog/Algorithm: ✨ λ°±μ€€, ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ Swift λ¬Έμ œν’€μ΄ ✨

✨ λ°±μ€€, ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ Swift λ¬Έμ œν’€μ΄ ✨. Contribute to deslog/Algorithm development by creating an account on GitHub.

github.com

import Foundation

var jobs = [[0, 3], [1, 9], [2, 6]]
// return 9
func solution(_ jobs:[[Int]]) -> Int {
    var sortedJobs = jobs.sorted(by: { $0[0] == $1[0] ? $0[1] < $1[1] : $0[0] < $1[0] })
    sortedJobs.sort(by: { $0[1] == $1[1] ? $0[0] < $1[0] : $0[1] < $1[1] })
    var now = 0
    var totalTime = 0

    while !sortedJobs.isEmpty {
        var check = false
        for i in 0..<sortedJobs.count {
            if sortedJobs[i][0] <= now {
                now += sortedJobs[i][1]
                totalTime += now - sortedJobs[i][0]
                sortedJobs.remove(at: i)
                check = true
                break
            }
        }
        // forλ¬Έμ•ˆμ—λ‹€κ°€ λ„£μ–΄μ„œ μ‹œκ°„ ν•œμ°Έκ±Έλ Έλ„€ γ… γ…  
        if !check {
            now += 1
        }
    }

    return totalTime / jobs.count
}

 

λ°˜μ‘ν˜•