BOJ 1406. 에디터
BOJ 1406. 에디터
풀이
커서의 왼쪽과 오른쪽에 각각 Stack으로 관리한다.
먼저 커서는 입력 문장의 끝에 위치하므로
커서 왼쪽 스택에 입력문장을 모두 넣고 시작한다.
입력문자 abcd
그 다음 P x
를 수행한다.
왼쪽 스택에 x를 push()
한다.
다음 L
명령을 수행한다.
왼쪽으로 커서를 한 칸 이동하게 되므로
왼쪽 스택에서 pop()
, 오른쪽으로 push()
그다음 P y
를 수행한다.
왼쪽 스택에 y를 push()
한다.
그 다음 출력을 위해 오른쪽 스택으로 모두 이동
오른쪽 스택에서 pop()
하여 순서대로 출력
import java.io.*;
import java.util.Stack;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int t = Integer.parseInt(br.readLine());
Stack<Character> leftStack = new Stack<>();
Stack<Character> rightStack = new Stack<>();
for (int i = 0; i < str.length(); i++) {
leftStack.push(str.charAt(i));
}
while (t-- > 0) {
String input = br.readLine();
String[] inputs = input.split(" ");
if ("L".equals(inputs[0])) {
if (leftStack.size() > 0) {
Character c = leftStack.pop();
rightStack.push(c);
}
} else if ("D".equals(inputs[0])) {
if (rightStack.size() > 0) {
Character c = rightStack.pop();
leftStack.push(c);
}
} else if ("B".equals(inputs[0])) {
if (leftStack.size() > 0) {
leftStack.pop();
}
} else {
leftStack.push(inputs[1].charAt(0));
}
}
StringBuilder sb = new StringBuilder();
while (!leftStack.isEmpty()) {
rightStack.push(leftStack.pop());
}
while (!rightStack.isEmpty()) {
sb.append(rightStack.pop());
}
System.out.print(sb);
}
}
코틀린 풀이에서는 커서 왼쪽은 Stack 오른쪽은 LinkedList를 이용한다.
fun main() {
val str = readLine()!!
val t = readLine()!!.toInt()
val st = Stack<Char>()
val q = LinkedList<Char>()
for (ch in str) {
st.push(ch)
}
repeat(t) {
when (val input = readLine()!!) {
"L" -> if (!st.isEmpty()) q.addFirst(st.pop())
"D" -> if (!q.isEmpty()) st.push(q.poll())
"B" -> if (!st.isEmpty()) st.pop()
else -> st.push(input.split(" ")[1][0])
}
}
println("${st.joinToString("")}${q.joinToString("")}")
}
풀이소스
github.com/beomjo/algorithm-study/blob/main/BOJ/java/1406.java github.com/beomjo/algorithm-study/blob/main/BOJ/kotlin/1406.kt