[백준] 에디터 (1406)(kotlin)

문제 설명

백준 1406번 문제 링크

입력 및 출력

» 입력

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수를 나타내는 정수 M(1 ≤ M ≤ 500,000)이 주어진다. 셋째 줄부터 M개의 줄에 걸쳐 입력할 명령어가 순서대로 주어진다. 명령어는 위의 네 가지 중 하나의 형태로만 주어진다.

» 출력

첫째 줄에 모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 출력한다.

예제 입출력(테스트케이스)

입력 출력
abcd
3
P x
L
P y
abcdyx
abc
9
L
L
L
L
L
P x
L
B
P y
yxabc
dmih
11
B
B
P x
L
B
B
B
P y
D
D
P z
yxz

문제 풀이1

import java.util.LinkedList

fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
    val bw = System.out.bufferedWriter()
    val q = LinkedList<Char>()

    readLine().forEach {
        q.add(it)
    }

    val m = readLine().toInt()
    val iter = q.listIterator()

    while (iter.hasNext()) {
        iter.next()
    }

    for (i in 0 until m) {
        val command = readLine()
        when (command[0]) {
            'L' -> if (iter.hasPrevious()) iter.previous()
            'D' -> if (iter.hasNext()) iter.next()
            'B' -> if (iter.hasPrevious()) {
                iter.previous()
                iter.remove()
            }
            'P' -> {
                iter.add(command[2])
            }
        }
    }

    for (c in q) {
        bw.append(c)
    }

    bw.flush()
    bw.close()
}

문제 풀이2(STACK)

import java.util.Stack

fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
    val bw = System.out.bufferedWriter()
    val lStack = Stack<Char>()
    val rStack = Stack<Char>()

    readLine().forEach {
        lStack.add(it)
    }

    val m = readLine().toInt()

    repeat(m) {
        val next = readLine()

        when(next[0]) {
            'P' -> {
                lStack.push(next[2])
            }
            'L' -> {
                if (lStack.isNotEmpty()) rStack.push(lStack.pop())
            }
            'B' -> {
                if (lStack.isNotEmpty()) lStack.pop()
            }
            'D' -> {
                if (rStack.isNotEmpty()) lStack.push(rStack.pop())
            }
        }
    }

    while (lStack.isNotEmpty() || rStack.isNotEmpty()) {
        if (lStack.isNotEmpty()) rStack.push(lStack.pop())
        else bw.append(rStack.pop())
    }

    bw.flush()
    bw.close()
}

문제 풀이2(LINKEDLIST)

import java.util.LinkedList

fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
    val bw = System.out.bufferedWriter()
    val lQ = LinkedList<Char>()
    val rQ = LinkedList<Char>()

    readLine().forEach {
        lQ.add(it)
    }

    val m = readLine().toInt()

    repeat(m) {
        val next = readLine()

        when(next[0]) {
            'P' -> lQ.addLast(next[2])
            'L' -> if (lQ.isNotEmpty()) rQ.addLast(lQ.pollLast())
            'B' -> if (lQ.isNotEmpty()) lQ.pollLast()
            'D' -> if (rQ.isNotEmpty()) lQ.addLast(rQ.pollLast())
        }
    }

    while (lQ.isNotEmpty()) rQ.addLast(lQ.pollLast())
    while (rQ.isNotEmpty()) bw.append(rQ.pollLast())

    bw.flush()
    bw.close()
}