728x90
https://programmers.co.kr/learn/courses/30/lessons/42627#qna
heap
이지만 정렬로만 풀은 문제..
시뮬레이션이라고 하는게 더 맞지 않나..싶은
왜 이곳에 heap을 써야하지..싶은..문제였달까
접근 방법
최종 종료 시간을 앞당기는게 문제가 아니라 대기시간+처리시간의 평균을 줄이는게 목적이다.
즉 대기시간을 줄이는게 문제의 목적임
SJF : shortest job first 대로 풀면 될 것 같은 문제이다. ....
즉 이 문제를 풀이한 방법은 지금 시간에 실행할 수 있는 작업 중 소요시간이 가장 짧은, 소요시간이 같다면 가장 먼저 들어온 작업부터 실행하는 로직이다.
최초에 시작하는 것은 시작시간이 가장 이른 것 중에 처리시간이 가장 짧은 작업을 수행해야 한다.
그래서 시작시간을 우선 기준으로 정렬을 하고 첫번째 작업을 pop한다.
그리고 이제 처리시간이 짧은 순으로 배열을 정렬하고 시뮬레이션 시작
now라는 시간 변수를 갖고 시간을 더해가면서 while 문을 반복하여 각 작업의 소요시간의 합을 구하는 식이다.
소스코드
import Foundation
func solution(_ jobs:[[Int]]) -> Int {
var sumOfProcessTime:Int = 0
var now:Int = 0
var sortedJobs:[[Int]] = jobs.sorted(by: {
$0[0] == $1[0] ? $0[1] < $1[1] : $0[0] < $1[0]
})
var task = sortedJobs[0]
sortedJobs.removeFirst()
sumOfProcessTime += task[1]
now = task[0]+task[1]
sortedJobs.sort(by: {
$0[1] == $1[1] ? $0[0] < $1[0] : $0[1] < $1[1]
})
while !sortedJobs.isEmpty {
var removeJob:Bool = false
for i in 0..<sortedJobs.count {
if sortedJobs[i][0] <= now {
sumOfProcessTime += (now-sortedJobs[i][0]) + sortedJobs[i][1]
now += sortedJobs[i][1]
sortedJobs.remove(at:i)
removeJob = true
break
}
}
if !removeJob {
now += 1
}
}
return sumOfProcessTime/jobs.count
}
728x90
'알고리즘 문제풀이' 카테고리의 다른 글
[백준 1620] 나는야 포켓몬 마스터 이다솜! (Swift) (0) | 2022.06.12 |
---|---|
[프로그래머스] 이중우선순위큐(C++) (0) | 2022.04.30 |
[프로그래머스] 징검다리 (Swift) (0) | 2022.04.20 |
[프로그래머스] 입국심사 (Swift) (0) | 2022.04.19 |
[프로그래머스] 카펫 (Swift) (0) | 2022.04.15 |