본문 바로가기
알고리즘/문자열 처리, 기타 자료구조

[java 백준] 실버 3/ 1406번 에디터

by Meaning_ 2021. 9. 1.
728x90
반응형

https://www.acmicpc.net/problem/1406

 

1406번: 에디터

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수

www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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 IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        Stack<Character> leftStack = new Stack<>();
        Stack<Character> rightStack = new Stack<>();
        String s = br.readLine();
        for (int i = 0; i < s.length(); i++) {
            leftStack.push(s.charAt(i));
        }
        int num = Integer.parseInt(br.readLine());
        for (int i = 0; i < num; i++) {
            String command = br.readLine();
            char c = command.charAt(0);
            if (c == 'P') {
                leftStack.push(command.charAt(2));
            } else if (c == 'L' && !leftStack.isEmpty()) {
                rightStack.push(leftStack.pop());
            } else if (c == 'D' && !rightStack.isEmpty()) {
                leftStack.push(rightStack.pop());
            } else if (c == 'B' && !leftStack.isEmpty()) {
                leftStack.pop();
            }
 
        }
        while (!leftStack.isEmpty()) {
            rightStack.push(leftStack.pop());
        }
        while (!rightStack.isEmpty()) {
            sb.append(rightStack.pop());
        }
        System.out.println(sb.toString());
 
    }
 
}
cs

 

 

처음엔 LinkedList로 구현해볼까 싶었지만 시간초과가 난다는 말을 듣고 스택으로 풀기로 결정! 하지만 한시간이 넘도록 아이디어가 생각나지 않아서 결국 다른 사람들의 코드를 봤다.. 진짜 어떻게 이렇게 구현할 수 있는지

나는 갈길이 멀다 ㅜㅜ 

풀이 설명 


풀이의 기본틀은 오른쪽 스택(오른쪽 커서)과 왼쪽 스택(왼쪽 커서)을 각각 만든다. 그리고 L이 나오면 왼쪽 스택의 맨 위 값을 오른쪽 스택에 push해준다. D는 오른쪽 스택의 맨 위값을 왼쪽 스택에 push해준다.

B의 경우는 왼쪽 스택의 값을 pop해주면 되고, P $는 왼쪽 스택에 $값을 push해주면된다. 

예를 들어 

 

abcd

3

P x

L

P y

있다고 가정해보자. 

 

우선

P x

L

까지 과정을 잘라서 보겠다. 

x가 오른쪽 스택으로 들어가면 왼쪽 스택에 있는 x는 pop()된다.

 

마지막

P y 과정을 살펴보면

 

 

while (!leftStack.isEmpty()) {

            rightStack.push(leftStack.pop());

        }

while (!rightStack.isEmpty()) {

            sb.append(rightStack.pop());

        }

 

모든 입력이 끝난 후 마지막 코드를 보게 되면 왼쪽 스택이 empty가 될 때까지 왼쪽 스택의 값을 오른쪽에 담아준다. 

 

이런 식으로 왼쪽 스택의 가장 위의 값을 오른쪽 스택의 가장 위에 차례대로 담아준다. 

 

배열을 만들어서 인덱스를 가지고 커서를 조절하는 방법도 있겠지만 스택의 push,pop을 통해 커서를 조절할 수 있다는 것을 알 수 있었다!(유익) 

728x90
반응형

댓글