Problem Solving/Java

백준 1406번 에디터 문제 Stack 활용 풀이 ( Java )

TakeKnowledge 2019. 9. 5. 15:46
반응형
 

1406번: 에디터

문제 한 줄로 된 간단한 에디터를 구현하려고 한다. 이 편집기는 영어 소문자만을 기록할 수 있는 편집기로, 최대 600,000글자까지 입력할 수 있다. 이 편집기에는 '커서'라는 것이 있는데, 커서는 문장의 맨 앞(첫 번째 문자의 왼쪽), 문장의 맨 뒤(마지막 문자의 오른쪽), 또는 문장 중간 임의의 곳(모든 연속된 두 문자 사이)에 위치할 수 있다. 즉 길이가 L인 문자열이 현재 편집기에 입력되어 있으면, 커서가 위치할 수 있는 곳은 L+1가지 경우가

www.acmicpc.net

처음엔 ArrayList를 활용해서 풀었다. 

 

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import java.io.*;
import java.util.ArrayList;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // reader 생성
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        // writer 생성
        ArrayList<Character> list = new ArrayList<Character>();
        // list 생성
        String input = br.readLine();
        // String 입력받음
        int cursor = input.length();
        // 커서 위치
        int max = input.length();
        // 오른쪽 끝 위치
        for (int i = 0; i < max; i++) {
            list.add(input.charAt(i));
        }
        // 리스트에 글자 담음
 
        String nStr = br.readLine();
        int n = Integer.parseInt(nStr);
        // 첫 라인을 읽고
 
        // 첫 라인에서 입력받은 라인만큼 반복
        for (int i = 0; i < n; i++) {
 
            String command = br.readLine();
            // 명령어 입력 받음
 
            if (command.startsWith("L")) {
                // 커서가 맨 왼쪽이 아니면
                if (cursor > 0) {
                    // 왼쪽으로 이동
                    cursor--;
                }
 
            } else if (command.startsWith("D")) {
                // 커서가 맨 오른쪽이 아니면
                if (cursor < max) {
                    // 오른쪽으로 이동
                    cursor++;
                }
 
            } else if (command.startsWith("B")) {
 
                // 커서가 맨 왼쪽이 아니면
                if (cursor > 0) {
                    // 왼쪽 글자 삭제
                    list.remove(--cursor);
                    // 글자수도 하나 감소
                    max--;
                }
 
            } else if (command.startsWith("P")) {
 
                String[] pCommand = command.split(" ");
                // 커서 위치에 $ 입력
                list.add(cursor, pCommand[1].toCharArray()[0]);
 
                // 커서, 최대값 증가
                cursor++;
                max++;
 
            }
 
        }
 
        // sb에 더해서
        StringBuilder sb = new StringBuilder("");
 
        for (char c : list) {
            sb.append(c);
        }
 
        // 출력
        bw.write(sb.toString());
 
        br.close();
        bw.flush();
        bw.close();
        // reader와 writer를 닫는다
    }
 
}

 

이클립스에서 잘 작동하길래 백준에 제출해봤는데

 

시간초과가 떴다.

 

멘붕..

 

내 머리속에 떠오르던 유일한 방법이었기에

혼자 풀기를 포기하고 강의를 들었더니 Stack을 활용해 풀 수 있었다

 

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import java.io.*;
import java.util.Stack;
 
public class Main {
 
    public static void main(String[] args) throws IOException {
 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // reader 생성
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        // writer 생성
        
        Stack<Character> lStack = new Stack<Character>();
        Stack<Character> rStack = new Stack<Character>();
        // 스택 생성
        
        String input = br.readLine();
        
        for (int i = 0; i < input.length(); i++) {
            lStack.push(input.charAt(i));
        }
        // 왼쪽 스택에 리스트에 글자 담음
 
        String nStr = br.readLine();
        int n = Integer.parseInt(nStr);
        // 첫 라인을 읽고
 
        // 첫 라인에서 입력받은 라인만큼 반복
        for (int i = 0; i < n; i++) {
 
            String command = br.readLine();
            // 명령어 입력 받음
 
            // 왼쪽이동
            if (command.startsWith("L")) {
                // 커서가 맨 왼쪽이 아니면
                if(!lStack.empty()) {
                    rStack.push(lStack.pop());
                }
            // 오른쪽 이동
            } else if (command.startsWith("D")) {
                // 커서가 맨 오른쪽이 아니면
                if(!rStack.empty()) {
                    lStack.push(rStack.pop());
                }
            // 커서 왼쪽 문자 삭제
            } else if (command.startsWith("B")) {
                
                // 커서가 맨 왼쪽이 아니면
                if(!lStack.empty()) {
                    lStack.pop();
                }
                
            // 커서 왼쪽 문자 추가
            } else if (command.startsWith("P")) {
                
                String[] pCommand = command.split(" ");
                
                lStack.push(pCommand[1].toCharArray()[0]);
 
            }
 
        }
 
        // lStack이 빌때까지 오른쪽 스택으로 옮기고
        while(!lStack.empty()) {
            rStack.push(lStack.pop());
        }
 
        // rStack이 빌때까지
        while(!rStack.empty()) {
            //출력
            bw.write(rStack.pop());
        }
 
        br.close();
        bw.flush();
        bw.close();
        // reader와 writer를 닫는다
    }
 
}

 

생각도 못했던 방법인데 너무 쉽게 풀 수 있어서 당황.

최백준 갓갓준..

반응형