본문 바로가기

알고리즘(w.KOTLIN)/자료구조

[백준][KOTLIN][1406] 에디터

728x90

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

 

1406번: 에디터

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수

www.acmicpc.net

문제 풀이

1. substring 을 이용해서 문자열을 변경하여 구현할 경우 시간초과가 발생한다.

2. left/right stack 을 정의해서 처음으로 입력된 문자열을 left stack 에 저장한다.

3. 편집기의 명령어가 "L" 일 경우 커서가 왼쪽으로 한 칸 이동했으므로 left stack 의 top 값을 빼서 right stack 에 저장한다. 이때 left stack 이 비어있으면 조건에 따라 명령어를 수행하지 않는다.

4. 편집기의 명령어가 "D" 일 경우 커서가 오른쪽으로 한 칸 이동했으므로 right stack 의 top 값을 빼서 left stack 에 저장한다. 이때 right stack 이 비어있으면 조건에 따라 명령어를 수행하지 않는다.

5. 편집기의 명령어가 "B" 일 경우 커서가 left stack 의 top 값을 빼낸다.

6. 편집기의 명령어가 "P" 일 경우 left stack 에 들어온 문자 값을 넣는다.

7. 최종적으로 출력 시 left stack 은 string 으로 그대로 출력하고 right stack 은 reverse 처리한 뒤 string 으로 출력한다.

코드

import java.io.*
import java.util.*

fun main(args: Array<String>) {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val input = br.readLine().toString()
    var cursor = input.length
    val M = br.readLine().toInt()
    val leftStack = Stack<Char>()
    val rightStack = Stack<Char>()

    input.forEach { i ->
       leftStack.add(i)
    }

    repeat(M) {
        val cmd = br.readLine().toString()

        if (cmd.startsWith("P")) {
            val value = cmd.toCharArray()[2]
            leftStack.add(value)
        } else {
            if (cmd == "L") {
                if (leftStack.isNotEmpty()) {
                    rightStack.add(leftStack.pop())
                }
            } else if (cmd == "D") {
                if (rightStack.isNotEmpty()) {
                    leftStack.add(rightStack.pop())
                }
            } else if (cmd == "B") {
                if (leftStack.isNotEmpty()) {
                    leftStack.pop()
                }
            }
        }
    }

    println("${String(leftStack.toCharArray())}${String(rightStack.reversed().toCharArray())}")



    // substring 으로 해결하면 시간 초과가 발생 함.
    /*repeat(M) {
        val cmd = br.readLine().toString()
        //println("TEST $cmd, $input")
        if (cmd.startsWith("P")) {
            val (c, v) = cmd.split(" ").map { it }
            //println("$c, $v")
            input = input.substring(0, cursor) + v + input.substring(cursor, input.length)
            cursor += v.length
        } else {
            if (cmd == "L") {
                if (cursor > 0) cursor -= 1
            } else if (cmd == "D") {
                if (cursor < input.length) cursor += 1
            } else if (cmd == "B") {
                if (cursor > 0) {
                    input = input.substring(1, input.length)
                    cursor -= 1
                }
            }
        }
    }

    println(input)*/
}
728x90