오늘도 더 나은 코드를 작성하였습니까?

Queue(큐) feat.kotlin 본문

자료구조

Queue(큐) feat.kotlin

hik14 2023. 11. 24. 01:16

정의

 

기본적인 자료구조의 한가지로, 먼저 집어 넣은 데이터가 먼저 나오는 FIFO(First In First Out)구조로 저장하는 형식을 말한다.

queue는 표를 사러 일렬로 늘어선 사람들로 이루어진 줄을 말하기도 하며, 먼저 줄을 선 사람이 먼저 나갈 수 있는 상황을 연상하면 된다.

나중에 집어 넣은 데이터가 먼저 나오는 스택과는 반대되는 개념이다.

 

https://www.acmicpc.net/problem/1158

 

1158번: 요세푸스 문제

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

www.acmicpc.net

Queue를 이용하여,  쉽게 무언가 지금 규칙에 맞지 않지만, 추후에 반드시 작업을 해주어야 한다면... 재삽입을 통해 1열로 대기시킨다. 

 

예시)

제거 되지 않은 숫자를 다시 뒤에 삽입한다.

k에 맞춰 제거될 수를 따로 보관한다.

위 행동을 큐가 모두 비워질 때까지 반복한다.

import java.util.LinkedList
import java.util.Queue

var n = 0
var k = 0

val q: Queue<Int> = LinkedList()
val result = mutableListOf<Int>()
fun main() = with(System.`in`.bufferedReader()) {

    val info = readLine().split(" ").map { it.toInt() }
    n = info[0]
    k = info[1]

    for (i in 1..n) {
        q.add(i)
    }

    while (q.isNotEmpty()) {
        for (i in 1 .. k) {
            val num = q.poll()
            if (i == k)
                result.add(num)
            else
                q.add(num)
        }
    }

    println("<${result.joinToString(", ")}>")
}

 

 

https://www.acmicpc.net/problem/13335

 

13335번: 트럭

입력 데이터는 표준입력을 사용한다. 입력은 두 줄로 이루어진다. 입력의 첫 번째 줄에는 세 개의 정수 n (1 ≤ n ≤ 1,000) , w (1 ≤ w ≤ 100) and L (10 ≤ L ≤ 1,000)이 주어지는데, n은 다리를 건너는 트

www.acmicpc.net

 

2개의 Queue를 이용하여,

다리와 대기하는 트럭의 상태를 구현하면 쉽게 해결할 수 있는 문제이다.

import java.util.*

var n = 0
var w = 0
var l = 0

lateinit var truckArr: IntArray

val waitingQueue: Queue<Int> = LinkedList()
val bridge: Queue<Truck> = LinkedList()

data class Truck(var weight: Int, var position: Int)

fun main() = with(System.`in`.bufferedReader()){

    val info = readLine().split(" ").map { it.toInt() }
    n = info[0]
    w = info[1]
    l = info[2]

    // 모든 트럭을 대기 큐에 넣는다.
    truckArr = readLine().split(" ").map { it.toInt() }.toIntArray()
    for (i in 0 until truckArr.size) {
        waitingQueue.add(truckArr[i])
    }

    val completeList = mutableListOf<Truck>()

    var time = 0
    while (truckArr.size > completeList.size) {
        time += 1

        // 다리 위의 트럭을 이동시킨다.
        if (bridge.isNotEmpty()) {
            // 다리위 트럭 1칸씩 이동.
            bridge.map { it.position += 1 }
            if (bridge.peek().position > w) {
                completeList.add(bridge.poll())
            }
        }

        // 대기 하는 트럭을 다리 위로 올려보낸다.
        if (waitingQueue.isNotEmpty()) {
            val bridgeWeight = bridge.sumOf { it.weight }
            val restWeight = l - bridgeWeight
            // 다리의 하중에 더 올라갈 여유가 있고, 다리위에 트럭이 올라갈 공간이 있다면
            if (restWeight >= waitingQueue.peek() && w > bridge.size)
                bridge.add(Truck(waitingQueue.poll(), 1))
        }
    }

    println(time)
}