본문 바로가기
  • 개발하는 곰돌이
Algorithm/BOJ

[Kotlin] 백준 23300 : 웹 브라우저 2

by 개발하는 곰돌이 2023. 1. 26.

문제 링크

 

23300번: 웹 브라우저 2

첫째 줄에 접속할 수 있는 웹페이지의 종류의 수 N, 사용자가 수행하는 작업의 개수 Q 가 각각 주어진다.(1 ≤ N, Q ≤ 2,000) 둘째 줄부터는 Q개의 작업이 주어지며, 각 작업이 의미하는 바는 다음

www.acmicpc.net


문제 해설

뒤로가기 목록을 저장할 스택과 앞으로가기 목록을 저장할 큐를 각각 만들면 손쉽게 해결할 수 있다. 본 코드에서는 덱을 사용했지만 크게 상관은 없다고 생각한다.

 

 

압축 기능은 뒤로가기 목록의 2번째 페이지부터 마지막 페이지까지 이동하면서 이전 페이지와 같으면 제거하는 식으로 구현했다.

Code

import java.util.StringTokenizer

fun main() = with(System.`in`.bufferedReader()) {
    val bw = System.out.bufferedWriter()
    val (n, q) = readLine().split(' ').map { it.toInt() }
    val back = ArrayDeque<Int>()
    val front = ArrayDeque<Int>()
    var current = 0
    for (i in 1..q) {
        val st = StringTokenizer(readLine())
        when (st.nextToken()) {
            "B" -> {
                if (back.isEmpty()) continue
                else {
                    front.addFirst(current)
                    current = back.removeLast()
                }
            }
            "F" -> {
                if (front.isEmpty()) continue
                else {
                    back.addLast(current)
                    current = front.removeFirst()
                }
            }
            "A" -> {
                front.clear()
                if (current != 0) back.addLast(current)
                current = st.nextToken().toInt()
            }
            "C" -> {
                var j = 1
                while (j < back.size) {
                    if (back[j - 1] == back[j]) {
                        back.removeAt(j--)
                    }
                    j++
                }
            }
        }
    }
    bw.write("$current\n")
    bw.write("${back.takeIf { it.isNotEmpty() }?.reversed()?.joinToString(" ") ?: -1}\n")
    bw.write("${front.takeIf { it.isNotEmpty() }?.joinToString(" ") ?: -1}")
    bw.close()
}

댓글