https://school.programmers.co.kr/learn/courses/30/lessons/42586
풀이
사실 코틀린은.. 큐 기능을 제공하지 않는다.
그렇기 때문에 사실 ArrayList로 풀어도 별 문제가 되지 않지만,, 자바 라이브러리의 ArrayList를 가져와서 써봤다.
그럼 왜 이 문제가 스택 / 큐의 문제이냐,,
문제에 나와있는데, '이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.'
라는 문구 때문이다. 즉, 첫번째 기능이 7일만에 개발되고, 두 번째 기능이 3일만에 개발되었어도, 두 번째 기능을 우선 배포할 수 없고, 첫번째 기능이 배포되었을 때 함께 배포되어야만 한다.
그럼 문제를 어떻게 풀건데?
두 가지 방법이 있겠다.
1. 진행값을 큐에 넣고 while 문등을 통해 큐 내부의 값들을 일자별로 더해간다.
큐의 첫 번째 요소가 100이 넘어가는 시점에, 뒤에서 100이 되는 모든 값들을 poll 하면서 poll된 값의 갯수를 찾는다.
그러면 아직 배포가 덜 된 값들만 남게 되는데, 이를 큐가 빌 때 까지 반복한다.
2. 각 요소의 완료일자를 계산한다. 이를 큐로 저장한다.
큐의 첫번째 요소를 빼고, 이 요소를 저장한다.
뒤의 큐들을 비교하며(peek) 빼버린 큐보다 더 값이 낮다면 해당 요소도 빼버리면서(poll) 첫 번째 요소보다 일찍 완성된 작업을 전부 빼버리고, 뺀 값들의 갯수를 찾는다.
그러면 배포가 덜 된 값들만 남게 되는데, 이를 큐가 빌 때 까지 반복한다.
나는 2번이 좀 더 간단할 것 같아서 2번으로 함.
import java.util.concurrent.LinkedBlockingQueue
import kotlin.math.ceil
class Solution {
fun solution(progresses: IntArray, speeds: IntArray): IntArray {
var answer = arrayListOf<Int>()
var linkedQueue = LinkedBlockingQueue<Float>()
//스택 큐? 로 굳이 풀어야 하나?
progresses.forEachIndexed { index, i ->
var day = ceil((100 - i).toFloat() / speeds[index])
println(day)
linkedQueue.put(day)
}
while (!linkedQueue.isEmpty()) {
var finishedDay = linkedQueue.poll()
var finished = 1 // 값 하나가 빠지고, 기능 하나가 완료됐음.
while (!linkedQueue.isEmpty() && linkedQueue.peek() <= finishedDay) {
linkedQueue.poll()
finished++
}
answer.add(finished)
}
println(answer)
return answer.toIntArray()
}
}
'스터디(programmers)' 카테고리의 다른 글
Java] 프로그래머스 lv.0, 외계어 사전 (0) | 2023.03.22 |
---|---|
Java] 프로그래머스 lv.1, 저주의 숫자 3 (0) | 2023.03.20 |
Java] 프로그래머스 lv.1, [1차] 비밀지도 (0) | 2023.03.08 |
Kotlin] 프로그래머스 lv.1, 로또의 최고 순위와 최저 순위 (0) | 2023.03.01 |
Kotlin] 프로그래머스 lv.1, 가장 가까운 같은 글자 (0) | 2023.02.22 |