```
백준 1966번 프린터 큐 Kotlin 구현해 보기
```

배워갈 내용
- 백준 1966번 풀이
문제 링크
https://www.acmicpc.net/problem/1966
1966번: 프린터 큐
여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에
www.acmicpc.net
문제 설명
백준 1966번 프린터 큐는
난이도 실버 등급의 문제로서
설명
주어진 프린터는 다음과 같은 방식으로 동작합니다
- Queue에 있는 문서 중
가장 앞에 있는 문서의 '중요도'를 확인합니다
- 나머지 문서들 중 현재 문서보다 중요도가 높은 문서가 하나라도 있다면,
이 문서를 인쇄하지 않고 Queue의 가장 뒤에 재배치합니다
- 그렇지 않다면, 현재 문서를 인쇄합니다
- 주어진 테스트 케이스마다, 현재 Queue에 있는 문서의 수와 중요도가 주어지고,
몇 번째로 인쇄되는지를 알아내야 합니다
예를 들어, 주어진
Queue에 4개의 문서 (A, B, C, D)가 있고, 중요도가 2, 1, 4, 3이라면,
C를 먼저 인쇄하고 D를 다음으로 인쇄하고 A, B를 인쇄하게 됩니다.
입력으로는 테스트 케이스의 수와 각 테스트 케이스별로
문서의 개수 N,
몇 번째로 인쇄할 문서인지를 나타내는 M,
그리고 N개의 문서의 중요도가 주어집니다.
문서의 중요도는 1 이상 9 이하의 정수이며,
중요도가 같은 문서가 여러 개 있을 수 있습니다
30분 정도 위에 링크를 방문하셔서 풀어보시고
안 풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.
코드 설명
입력을 받고
정해진 조건에 맞춰서 계산을 해서 출력해 주면 되는
문제입니다.
문제에 요구에 맞게 큐에 넣고 빼고를 반복해서 풀었습니다
요즘에는 주석이나 설명 없이 코드로 설명하고자 노력 중입니다
만약 코드가 이해가 안 가시면 댓글 부탁드립니다
코드
import java.util.*
fun main() {
val inputDto = readInput()
print(inputDto.findPriorities())
}
data class InputDto(
val testCaseNum: Int,
val ppDtos: MutableList<PrinterPriorityDto>
) {
fun findPriorities(): String {
return ppDtos
.map { k -> k.findPriority() }
.toList()
.joinToString("\n")
}
}
data class PrinterPriorityDto(
val n: Int,
val m: Int,
val priorities: List<PrintQueItemDto>
) {
fun findPriority(): Int {
val q: Queue<PrintQueItemDto> = LinkedList(priorities)
var idx = 0
val origIdx = priorities[m].origIdx
while (q.isNotEmpty()) {
val current = q.poll()
if (q.none { it.priority > current.priority }) {
idx++
if (origIdx == current.origIdx) {
return idx
}
} else {
q.add(current)
}
}
return 0
}
}
data class PrintQueItemDto(
val origIdx: Int,
val priority: Int
)
fun readInput(): InputDto {
val testCaseNum = readLine()?.toIntOrNull() ?: throw IllegalArgumentException("Invalid testCaseNum")
val ppDtos = mutableListOf<PrinterPriorityDto>()
repeat(testCaseNum) {
val (n, m) = readLine()
?.split(" ")
?.map { it.toInt() }
?: throw IllegalArgumentException("Invalid input for 'n' and 'm'")
val priorities = readLine()
?.split(" ")
?.mapIndexed { idx, it ->
PrintQueItemDto(idx, it.toInt())
}
?: throw IllegalArgumentException("Invalid input for priorities")
ppDtos.add(PrinterPriorityDto(n, m, priorities))
}
return InputDto(testCaseNum, ppDtos)
}
// https://codemasterkimc.tistory.com/
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
'Kotlin > Kotlin 알고리즘' 카테고리의 다른 글
| 백준 2083번 럭비 클럽 구현해 보기 (1) | 2023.10.14 |
|---|---|
| 백준 30328번 Java Warriors Kotlin 구현해 보기 (1) | 2023.10.14 |
| 백준 3040번 백설 공주와 일곱 난쟁이 Kotlin 구현해 보기 (0) | 2023.10.08 |
| 백준 18110번 solved.ac Kotlin 구현해 보기 (0) | 2023.10.08 |
| 백준 11866번 요세푸스 문제 0 Kotlin 구현해 보기 (0) | 2023.10.07 |