문제
명령어를 받아 문자열을 수정하는 에디터를 작성하는 문제. 처음 문자열과 명령어 개수, 명령어 L, D, B, P $가 입력된다. 커서를 이용해 문자열을 수정하는데, 처음 커서는 문자열의 맨 뒤에 있다. L의 경우에는 커서를 왼쪽으로 하나, D의 경우에는 커서를 오른쪽으로 하나, B는 커서의 왼쪽 문자를 삭제하고, P ~ 의 경우에는 해당 문자를 커서 뒤에 추가해준다. 커서는 보통 컴퓨터에서 움직이는 것 처럼 움직인다.
처음 접근방법
cursor를 String의 인덱스로 이용해 문제 그대로 구현하였고, 시간초과가 났다. StringBuffer을 이용해도 시간초과가 났기 때문에 구현하는 방법을 바꿔야 했다.
수정된 접근방법
스택 2개를 이용한다.
커서를 스택 A의 pop위치라고 두고, 스택 B는 커서 뒤에 있는 문자를 저장한다.
명령어 수행 방법
L : 스택 A를 스택 B로 옮긴다.
stack_B.push(stack_A.pop());
명령어 D : 스택 B를 스택 A로 옮긴다.
stack_A.push(stack_B.pop());
명령어 B : 스택 A를 pop 해준다.
명렁어 P : 스택 A에 문자를 push 해준다.
여기서 stack이 비어있을 경우를 꼭 확인해 주어야한다.
소스코드
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String text = in.readLine();
int N = Integer.parseInt(in.readLine());
Stack<Character> stack = new Stack<>();
Stack<Character> stack_tmp = new Stack<>();
for(int i=0; i<text.length(); i++)
stack.push(text.charAt(i));
for(int i=0; i<N; i++){
String cmd = in.readLine();
if(cmd.charAt(0) == 'L'){
if(!stack.isEmpty())
stack_tmp.push(stack.pop());
}else if(cmd.charAt(0) == 'D'){
if(!stack_tmp.isEmpty())
stack.push(stack_tmp.pop());
}else if(cmd.charAt(0) == 'B'){
if(!stack.isEmpty())
stack.pop();
}else if(cmd.charAt(0) == 'P'){
stack.push(cmd.charAt(2));
}
}
while(!stack_tmp.isEmpty()){
stack.push(stack_tmp.pop());
}
StringBuilder answer = new StringBuilder();
while(!stack.isEmpty()){
answer.append(stack.pop());
}
System.out.println(answer.reverse().toString());
'알고리즘' 카테고리의 다른 글
[JAVA] 백준 1986 : 체스 (0) | 2019.02.21 |
---|---|
[JAVA] 백준 1347 : 미로만들기 (0) | 2019.02.06 |
[JAVA] 백준 2512 : 예산 (0) | 2019.02.02 |
[JAVA] 백준 3985 : 롤케이크 (0) | 2019.02.01 |
[JAVA] 백준 10610 : 30 (0) | 2019.02.01 |