Coding Test/Baekjoon
백준/1406/Java - 에디터
grogu....
2023. 2. 21. 01:55
문제
https://www.acmicpc.net/problem/1406
1406번: 에디터
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수
www.acmicpc.net
주어진 명령어들을 살펴보면 커서의 위치가 중요하다는 것을 알 수 있다.
커서의 위치에 따라 문자를 어디에 추가하거나, 어떤 문자를 삭제할지 결정되기 때문이다.
dmih라는 문자열이 주어졌을 때 커서의 위치를 '로 표현하면, 처음에는 문제의 조건에 따라 가장 우측에 위치한다.
d | m | i | h | ' |
만약 명령어 L에 따라 커서를 왼쪽으로 옮긴 뒤 명령어 P x로 x를 입력하면 다음과 같다.
L:
d | m | i | ' | h |
P x:
d | m | i | x | ' | h |
B:
d | m | i | x | h | ' |
만약 커서를 기준으로 좌우를 각각 스택이라고 생각한다면,
커서 기준 좌측은 가장 좌측 문자가 맨위에 있는 스택(이하 스택1)이고
커서 기준 우측은 가장 우측 문자가 맨위에 있는 스택(이하 스택2)이라고 볼 수 있다.
즉 다음과 같이 각 명령어를 해석할 수 있다.
명령어 L : (좌측 스택이 비어있지 않다면) 스택1의 맨 위 문자를 스택2로 보냄
명령어 D : (우측 스택이 비어있지 않다면) 스택2의 맨 위 문자를 스택1로 보냄
명령어 B : (커서 좌측 문자열을 지우는 것이므로 좌측 스택이 비어있지 않다면) 스택1 맨위 문자 삭제
명령어 P $:(커서 좌측에 추가하는 것이니까)스택1에 문자 $ 추가
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
//커서 좌측 문자 스택(커서에 가까울수록 = 뒤에 있는 문자일수록 스택의 상단 위치)
Stack<Character> stack1 = new Stack<>();
//커서 우측 문자 스택(커서에 가까울수록 = 앞에 있는 문자일수록 스택의 상단 위치)
Stack<Character> stack2 = new Stack<>();
String s = br.readLine();
for(int i=0; i<s.length(); i++) {
char c = s.charAt(i);
stack1.push(c);
}
int n = Integer.parseInt(br.readLine());
String command;
for(int i=0; i<n; i++) {
command = br.readLine();
if(command.equals("L")) {
if(!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
}
else if(command.equals("D")) {
if(!stack2.isEmpty()) {
stack1.push(stack2.pop());
}
}
else if(command.equals("B")) {
if(!stack1.isEmpty()) {
stack1.pop();
}
}
else {
//P $의 경우 영어 소문자 1개를 추가하는 명령어임.
char $ = command.charAt(2);
stack1.push($);
}
}
/*
출력 시 커서를 문자열 맨 앞으로 옮겨놓고(=모든 문자를 커서 우측 스택으로 보내놓고)
StringBuilder에 추가하면 맨 앞 문자부터 추가됨.
*/
while(!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
while(!stack2.isEmpty()) {
sb.append(stack2.pop());
}
System.out.println(sb);
}
}