[백준] 에디터 (1406)(kotlin)
문제 설명
입력 및 출력
» 입력
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 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()
}