본문 바로가기

알고리즘

[프로그래머스] 프린터 #코틀린 #kotlin #큐 #queue #level2

반응형

https://programmers.co.kr/learn/courses/30/lessons/42587?language=kotlin 

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

풀이

먼저, 인쇄가 이루어지는 절차는 다음과 같습니다.

  1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
  2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
  3. 그렇지 않으면 J를 인쇄합니다.
  4. 문서가 모두 인쇄될 때까지 반복합니다.

이를 코틀린 코드로 표현하면 다음과 같습니다. Queue를 사용하여도 좋겠지만, 임의 접근이 가능한 Mutable List를 사용하여도 같은 기능을 흉내낼 수 있습니다. .any 메소드는 클로저에 정의된 함수가 참인 경우가 하나라도 존재하면 true를 반환하는 메소드입니다. 이를 통해 현재 값보다 하나라도 큰 값이 있는지 확인할 수 있습니다.

fun solution(priorities: IntArray, location: Int): Int {
  val printerQueue = priorities.withIndex().toMutableList()
  while (printerQueue.isNotEmpty()) {
    val first = printerQueue.first()
    printerQueue.removeAt(0)

    if (printerQueue.any { first.value < it.value }) {
      printerQueue.add(first)
      continue
    }
    // else
    // print document...
  }
}

우리가 원하는 location의 문서가 몇 번째로 인쇄되는지 확인하기 위해, 인쇄된 문서의 수를 세는 count 변수가 필요합니다. 또한, 우리가 원하는 문서가 출력된 이후에는 반복문을 유지할 필요가 사라집니다. 따라서 다음과 같이 조건에 부합하면 반복문을 탈출할 수 있습니다.

fun solution(priorities: IntArray, location: Int): Int {
  var count = 0
  var first: IndexedValue<Int>
  val printerQueue = priorities.withIndex().toMutableList()

  while (printerQueue.isNotEmpty()) {
    first = printerQueue.first()
    printerQueue.removeAt(0)

    if (printerQueue.any { first.value < it.value }) {
      printerQueue.add(first)
      continue
    }
    count++
    if (first.index == location) {
      break
    }
  }
  return count
}
반응형