프린터 대기 목록에서 첫번째 원소를 꺼내거나 새로운 원소를 추가하기 쉽게 LinkedList로 대기 목록(queue
)을 구현했고,
대기 목록에 있는 문서들 중에 가장 높은 중요도가 무엇인지 빠르게 알 수 있게 PriorityQueue(priorityQueue
)에 문서들의 우선순위를 담아서 구현했다.
PriorityQueue의 top에 있는 값(현재 대기 목록에 있는 문서들 중 가장 높은 중요도)이 LinkedList의 첫번째 원소의 중요도와 같으면 그 문서를 출력, 그리고 내가 요청한 문서가 맞으면 바로 결과 return
PriorityQueue의 top에 있는 값(현재 대기 목록에 있는 문서들 중 가장 높은 중요도)이 LinkedList의 첫번째 원소의 중요도와 같지 않으면 다시 queue
에 문서 넣기
import java.util.*
class Solution {
fun solution(priorities: IntArray, location: Int): Int {
var answer = 0
val queue = LinkedList<Document>()
val priorityQueue = PriorityQueue<Int>(Collections.reverseOrder())
// 대기 목록, 문서 중요도를 각각 queue, priority queue에 담기
priorities.forEachIndexed { index, priority ->
queue.add(Document(index, priority))
priorityQueue.add(priority)
}
while (queue.isNotEmpty()) {
val currentPriority = priorityQueue.peek()
// 1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
val document = queue.removeFirst()
if (currentPriority == document.priority) {
priorityQueue.poll()
answer++
if (location == document.index) break // 3. 그렇지 않으면 J를 인쇄합니다.
} else {
// 2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
queue.add(document)
}
}
return answer
}
data class Document(val index: Int, val priority: Int)
}
원래 대기 목록(내 코드에서 queue
에 해당)을 따로 두지 않고 PriorityQueue에 Document를 넣어서 처리하려고 했는데, 이렇게 구현하면 중요도가 같은 문서들을 출력하는 순서가 꼬일 수 있다. 왜냐면 PriorityQueue는 입력 순서는 중요하지 않으니까!! 순서를 유지해야 하는 경우에는 PriorityQueue만 사용하는 건 적절하지 않다는 걸 깨달은 오늘!🌞
다른 사람들의 코드를 보니까 Queue를 LinkedList보다는 ArrayDeque를 많이 쓰는 것 같다. 찾아보니까 단순 삽입, 삭제는 ArrayDeque가 더 빠르고 메모리도 더 효율적으로 쓴다고 한다!