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
'알고리즘(w.KOTLIN) > 자료구조' 카테고리의 다른 글
[프로그래머스][Level1][178871] 달리기 경주 (0) | 2023.06.22 |
---|---|
[알고리즘][KOTLIN] 두 큐 합 같게 만들기 (0) | 2022.12.04 |
[알고리즘][KOTLIN] 택배상자 (0) | 2022.12.03 |
[알고리즘][KOTLIN] 롤케이크 자르기 (1) | 2022.12.03 |