https://www.acmicpc.net/problem/1406
난이도 : 실버 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
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())
}
😆
'코딩테스트 > Kotlin' 카테고리의 다른 글
[백준 4949번] [Kotlin] 균형잡힌 세상 (0) | 2023.07.10 |
---|---|
[백준 11328번] [Kotlin] Strfry (0) | 2023.07.10 |
[백준 10819번] [Kotlin] 차이를 최대로 (0) | 2023.07.03 |
[백준 6588번] [Kotlin] 골드바흐의 추측 (0) | 2023.06.29 |
[백준 7562번] [Kotlin] 나이트의 이동 (0) | 2023.06.29 |