Baekjoon algorithm training

[백준] 10845 (큐)

interfacer_han 2023. 12. 14. 16:35

#1 알고리즘

java.util.Stack과는 달리 java.util.Queue는 클래스가 아니라 인터페이스다. 나는 java.util.Queue 인터페이스를 구현한 클래스인 LinkedList를 Queue로서 사용했다. last()는 확장 함수(Extension functions)다.
 

#2 여담

확장 함수 Iterable<T>.last()가 기술된 _Collections.kt실제 위치가 kotlin-stdlib.jar/kotlin/collections에 있지는 않지만, 논리적인 구조상 파일 첫머리의 pakage에 kotlin.collections로 선언되어 있다. 참고로, _Collections.kt와 Collections.kt는 다른 파일이며 후자는 해당 디렉토리에 실제로 존재한다. 물론, 패키지 선언은 논리적인 구조를 나타내기 위한 것이므로 파일이 실제로 해당 패키지에 위치하지 않더라도 패키지명을 기준으로 import할 수 있다. 다만, 코틀린 표준 라이브러리(kotlin-stdlib.jar)는 기본적으로 프로젝트에 포함되어있기 때문에 일반적인 경우 어차피 import문 없이 그냥 쓸 수 있긴 하다.
 

#3 코드 - 코틀린

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.util.LinkedList
import java.util.Queue

fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val bw = BufferedWriter(OutputStreamWriter(System.out))

    // Map이 Interface이기 때문에 new Map()과 같은 코드가 불가능한 것처럼, Queue도 마찬가지다. LinkedList()는 Queue의 인터페이스를 구현하고 있기 때문에, LinkedList()를 Queue로서 쓸 수 있다.
    val queue : Queue<Int> = LinkedList()

    val commandCount = br.readLine().toInt()
    for(i : Int in 0..<commandCount) {
        val command = br.readLine()

        if(command.contains("push")) {
            val pushValue = command.substring(5).toInt() // 6번째 문자부터 끝 문자까지 추출
            queue.offer(pushValue)

        } else if(command == "pop") {
            if(queue.isEmpty()) {
                bw.write("-1\n")
            } else {
                bw.write("${queue.poll()}\n")
            }

        } else if(command == "size") {
            if(queue.isEmpty()) {
                bw.write("0\n")
            } else {
                bw.write("${queue.size}\n")
            }

        } else if(command == "empty") {
            if(queue.isEmpty()) {
                bw.write("1\n")
            } else {
                bw.write("0\n")
            }

        } else if(command == "front") {
            if(queue.isEmpty()) {
                bw.write("-1\n")
            } else {
                bw.write("${queue.peek()}\n")
            }

        } else if(command == "back") {
            if(queue.isEmpty()) {
                bw.write("-1\n")
            } else {
                // 코틀린의 확장 함수 last()는 Iterable 인터페이스를 확장한다.
                bw.write("${queue.last()}\n")
            }

        } else {
            continue
        }
    }

    br.close()

    bw.flush()
    bw.close()
}

'Baekjoon algorithm training' 카테고리의 다른 글

[백준] 11723 (집합)  (0) 2023.12.21
[백준] 2108 (통계학)  (0) 2023.12.15
[백준] 28417 (스케이트보드)  (0) 2023.12.11
[백준] 11866 (요세푸스 문제 0)  (0) 2023.12.09
[백준] 4949 (균형잡힌 세상)  (0) 2023.12.07