[프로그래머스] 프린터 in Kotlin

ddanglehee·2022년 8월 5일
0

코딩테스트 준비

목록 보기
3/18
post-thumbnail
post-custom-banner

📜 문제

문제 링크

💡 나의 풀이

프린터 대기 목록에서 첫번째 원소를 꺼내거나 새로운 원소를 추가하기 쉽게 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가 더 빠르고 메모리도 더 효율적으로 쓴다고 한다!

profile
잊고싶지 않은 것들을 기록해요✏️
post-custom-banner

0개의 댓글