백준 1966번 문제입니다. (solved.ac)기준 실버 3 문제입니다.
문제
문제 접근
MutableList<Pair<Int, Boolean>> 타입의 queue를 만들고 queue 문서의 ( 중요도, 찾는 값인지 여부 )를 Pair을 이용한 쌍으로 받아서 관리할 것입니다.
빠른 입출력을 사용하였고 repeat(br.readLine().toInt()) 를 사용하여 첫 줄에 입력되는 테스트 케이스만큼 반복하도록 하였습니다.
테스트 케이스의 첫 번째 줄에는 문서의 개수(N), 몇 번째로 인쇄되었는지 궁금한 문서가 현재 Queue에서 몇 번째에 놓여 있는지를 나타내는 정수(M)가 입력됩니다. (인덱스는 0부터 시작하기 때문에 맨 왼쪽은 0입니다.)
예를 들어 4 3 과 같이 입력이 되었다면 문서는 4개이고 M이 3 번째에 놓여있다는 소리이기 때문에 문서의 마지막 원소가 궁금한 원소입니다. 예시) 큐 = (원소, 원소, 원소, M)
그다음 줄에는 문서의 중요도가 차례로 주어집니다.
문서의 중요도를 입력받으면 forEachIndexed문을 사용하여 모든 원소를 탐색하며 입력받은 순서대로 queue에 Pair 타입으로 넣어줍니다. Pair의 첫번째 원소로는 중요도, 두 번째 원소로는 몇 번째로 인쇄되었는지 궁금한 문서라면 true, 아니라면 false를 넣어주어 true가 queue에서 제거되었음을 알 수 있도록 하였습니다.
MutableList<Pair<Int, Boolean>>를 인자로 받고 int를 반환하는 countPrint() 함수를 만들었습니다.
countPrint() 함수는 반복문을 사용하여 M원소가 빠져나갈 때까지 반복하도록 하였습니다.
반복문 안에서는 queue의 가장 앞에 있는 문서의 우선순위가 가장 높은 게 아니라면 뒤로 보내고 우선순위가 가장 높은 게 맞다면 그 가장 앞에 있는 문서를 제거할 수 있도록 하였습니다. countPrint() 함수 안에서 cnt변수를 사용하여 우선순위가 가장 높은 원소가 빠져나갈 때마다 cnt++를 하여 M원소가 몇 번째로 프린트되었는지 판별할 수 있도록 하였습니다.
정답 코드
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.util.*
fun main() {
// 빠른 입출력
val br = BufferedReader(InputStreamReader(System.`in`))
val bw = BufferedWriter(OutputStreamWriter(System.out))
var queue : MutableList<Pair<Int, Boolean>>
// 테스트 케이스만큼 반복
repeat(br.readLine().toInt()) {
// MutableList 초기화
queue = mutableListOf()
// [0] 문서의 개수, [1] 몇 번째로 인쇄되었는지 궁금한 문서의 현재 Queue에서의 위치
val inform = br.readLine().split(" ")
val doc = br.readLine().split(" ")
// 문서를 순서대로 큐에 넣어줌.
doc.forEachIndexed { index, doc ->
// 몇 번째로 인쇄되었는지 궁금한 문서라면 true, 아니라면 false와 같이 넣어줌.
if (index == inform[1].toInt()) queue.add(Pair(doc.toInt(), true))
else queue.add(Pair(doc.toInt(), false))
}
bw.write("${ countPrint(queue) }\n")
}
bw.flush()
bw.close()
}
fun countPrint(queue: MutableList<Pair<Int, Boolean>>): Int {
var cnt = 0;
while (true in queue.map { it.second }) {
// queue에 있는 가장 앞에있는 문서의 우선순위가 가장 높은게 아니라면
if (queue.get(0).first != Collections.max(queue.map { it.first })) {
queue.add(Pair(queue.get(0).first, queue.get(0).second))
queue.removeAt(0)
} else if (queue.get(0).first == Collections.max(queue.map { it.first })) {
cnt++
queue.removeAt(0)
}
}
return cnt
}
'알고리즘 문제풀이[Algorithm]' 카테고리의 다른 글
[백준] 1157번 단어 공부(코틀린 - Kotlin) (0) | 2022.05.10 |
---|---|
[백준] 1110 더하기 사이클(Kotlin - 코틀린) (0) | 2022.04.27 |
[백준] 10826 피보나치 수 4(BigInteger)(Kotlin - 코틀린) (0) | 2022.04.22 |
백준 7568번 덩치(Kotlin - 코틀린) (0) | 2022.04.20 |
[백준] 4386번 별자리 만들기(크루스칼 알고리즘)(Python - 파이썬) (0) | 2022.03.11 |
최근댓글