반응형

백준 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
}
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기