명령어에 따라 커서를 바꿔가며 문자를 추가 또는 삭제한다.
최종적으로 문자열을 출력한다.
package src.baekjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main3 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringBuilder bft = new StringBuilder(br.readLine());
int cursor = bft.length();
for (int i = 1; i <= N; i++) {
String line = br.readLine();
int length = bft.length();
switch (line.charAt(0)) {
case 'P':
char param = line.charAt(line.length() - 1); //ok
String left = bft.substring(0, cursor);
String right = bft.substring(cursor, length);
bft.setLength(0);
bft.append(left).append(param).append(right);
cursor++;
break;
case 'L':
cursor = cursor == 0 ? cursor : --cursor;
break;
case 'D':
cursor = cursor == length ? cursor : ++cursor;
break;
case 'B':
if (cursor > 0) {
bft.deleteCharAt(--cursor);
}
else {
cursor = 0;
continue;
}
break;
default:
break;
}
}
System.out.println(bft);
}
}
시간초과로 실패.
더 나은 방법을 찾다가 2개의 스택으로 풀라고 해서 다시 풀었다.
package src.baekjoon;
import java.io.*;
import java.util.Stack;
public class Main3_2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String str = br.readLine();
int N = 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));
}
for (int i = 1; i <= N; i++) {
String line = br.readLine();
switch (line.charAt(0)) {
case 'P':
char param = line.charAt(line.length() - 1); //ok
leftStack.push(param);
break;
case 'L':
//왼쪽으로 커서를 이동, left top을 right에 push
if (!leftStack.isEmpty())
rightStack.add(leftStack.pop());
break;
case 'D':
//오른쪽으로 커서를 이동, right top을 left에 push
if (!rightStack.isEmpty())
leftStack.push(rightStack.pop());
break;
case 'B':
if (!leftStack.isEmpty())
leftStack.pop();
break;
default:
break;
}
}
while(!leftStack.isEmpty())
rightStack.add(leftStack.pop());
while(!rightStack.isEmpty())
bw.write(rightStack.pop());
bw.flush();
bw.close();
}
}
훨씬 코드가 간결하다.
leftStack과 rightStack을 각각 출력하면 아래와 같다.
최종 결과값은 yxabc가 되어야 한다.
따라서 leftStack은 앞에서부터, rightStack은 뒤에서부터 가져와야 한다는 것을 알 수 있다.
처음에 rightStack을 queue로 구현할까 생각도 했지만,
더 간단하게 leftStack을 전부 rightStack에 넣고 rightStack을 출력하면 문제가 해결되었다.
결과를 출력하기 위해서는
1. StringBuilder에 append하고 변수를 그대로 출력한다.
StringBuilder result = new StringBuilder(); // 결과문자열
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.flush();
bw.close();
2일