[JAVA] 백준 1406 : 에디터


문제

명령어를 받아 문자열을 수정하는 에디터를 작성하는 문제. 처음 문자열과 명령어 개수, 명령어 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

+ Recent posts