https://www.acmicpc.net/problem/1406
1406번: 에디터
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수
www.acmicpc.net
저는 구현을 통해서 문제를 해결하였습니다.
저는 2개의 LinkedList를 통해 커서의 왼쪽에 있는 것과 오른쪽에 있는 것을 나누었습니다.
커서을 옮길때, 만약 왼쪽으로 옮긴다면 왼쪽의 LinedList의 맨 뒤에 있는 것을 오른쪽의 LinkedList 맨 앞에 놓도록 하였습니다. 오른쪽이라면 반대로 진행하도록 하였습니다.
package BOJ.etc;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Stack;
public class BOJ_1406 {
private static final char MOVE_LEFT = 'L';
private static final char MOVE_RIGHT = 'D';
private static final char DELETE_LEFT = 'B';
private static final char APPEND = 'P';
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
LinkedList<Character> left = new LinkedList<>();
LinkedList<Character> right = new LinkedList<>();
String str = br.readLine();
for(int i = 0 ; i < str.length() ; i++){
left.offerLast(str.charAt(i));
}
int n = Integer.parseInt(br.readLine());
for(int i = 0 ; i < n ; i++){
String command = br.readLine();
char type = command.charAt(0);
if(type == MOVE_LEFT){
if(!left.isEmpty()){
right.offerFirst(left.pollLast());
}
continue;
}
if(type == MOVE_RIGHT){
if(!right.isEmpty()){
left.offerLast(right.pollFirst());
}
continue;
}
if(type == DELETE_LEFT){
if(!left.isEmpty()){
left.pollLast();
}
continue;
}
if(type == APPEND){
char ch = command.charAt(2);
left.offerLast(ch);
}
}
StringBuilder result = new StringBuilder();
while(!right.isEmpty() || !left.isEmpty()){
if(!left.isEmpty()){
result.append(left.pollFirst());
continue;
}
if(!right.isEmpty()){
result.append(right.pollFirst());
continue;
}
}
System.out.println(result.toString());
}
}
'알고리즘' 카테고리의 다른 글
백준 21921번 블로그 (JAVA) (0) | 2022.08.12 |
---|---|
백준 16954번 움직이는 미로 탈출 (JAVA) (0) | 2022.08.11 |
백준 14921번 용액 합성하기 (JAVA) (0) | 2022.08.09 |
백준 17822번 원판 돌리기 (JAVA) (0) | 2022.08.08 |
벡즌 17090번 미로 탈출하기 (JAVA) (0) | 2022.08.07 |