Uknow's Lab.
article thumbnail

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

 

1406번: 에디터

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

www.acmicpc.net

 

난이도 : 실버 2
태그 : 자료구조, 스택, 연결리스트

 

 

시도 1

 

간단히 생각해보면,

스택이나 리스트 하나를 만들어두고

커서의 위치를 담을 cursorIdx 변수를 만들어

특정 위치에서 add 혹은 remove를 하면 쉽게 풀릴 것 같네요

 

import java.util.StringTokenizer

fun main() = with(System.`in`.bufferedReader()) {
    val words = readLine().toMutableList()
    var cursorIdx = words.size

    repeat(readLine().toInt()) {
        val st = StringTokenizer(readLine())

        when (st.nextToken()) {
            "L" -> cursorIdx--
            "D" -> cursorIdx++
            "B" -> if (cursorIdx > 0) words.removeAt(--cursorIdx)
            "P" -> words.add(cursorIdx++, st.nextToken()[0])
        }
        if (cursorIdx < 0) cursorIdx = 0
        if (cursorIdx > words.size) cursorIdx = words.size
    }

    println(words.joinToString(""))
}

 

흠... 아니군... 🤨

 

 

시도 2

생각해보니 예전에 중앙을 중심으로 우선순위 큐를 양쪽에 사용한 적이 있었지...?

그럼 이번에 스택을 양쪽으로 사용해볼까?

https://uknowblog.tistory.com/335

 

[백준 2696번] [Kotlin] 중앙값 구하기

https://www.acmicpc.net/problem/2696 2696번: 중앙값 구하기 첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스의 첫째 줄에는 수열의 크기 M(1 ≤ M ≤ 9999, M은 홀수)이 주어지

uknowblog.tistory.com

 

 

 

leftStack과 rightStack을 따로 두어,

커서를 왼쪽으로 이동해야 한다면 leftStack에서 하나 떼서 rightStack에 넣으면,

커서가 이동한것과 같은 효과를 보지 않을까?

 

import java.util.*

fun main() = with(System.`in`.bufferedReader()) {
    val words = readLine()

    val leftStack = Stack<Char>()
    val rightStack = Stack<Char>()

    for (word in words) leftStack.add(word)

    repeat(readLine().toInt()) {
        val st = StringTokenizer(readLine())
        when (st.nextToken()) {
            "L" -> if (leftStack.isNotEmpty()) rightStack.push(leftStack.pop())
            "D" -> if (rightStack.isNotEmpty()) leftStack.push(rightStack.pop())
            "B" -> if (leftStack.isNotEmpty()) leftStack.pop()
            "P" -> leftStack.push(st.nextToken()[0])
        }
    }
    println(leftStack.joinToString("") + rightStack.joinToString("").reversed())
}

 

😆

 

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.