문제/백준

백준 1406번 에디터 [JAVA]

javaju 2021. 10. 20. 22:34
 

1406번: 에디터

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

www.acmicpc.net

 

풀이 방법

해당 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 출력하는 문제였습니다.

 

저는 초기 편집기에 입력되어 있는 문자열을 list에 넣고 list의 사이즈를 index로 해당 커서의 위치를 변경해주면서 명령어를 수행해주었습니다. 하지만 채점 결과 시간 초과가 발생했고 이 문제를 해결하기 위해 질문게시판과 블로그를 찾아봤습니다.

 

이 문제는 삽입/삭제가 빈번하게 일어나는데 빠른 처리시간을 요구하고 있었습니다. 그래서 더 빠르게 현재 위치를 찾으면서 삽입/삭제를 처리할 수 있는 방법을 찾았습니다.

 

바로 ListIterator을 사용하는 것이었습니다.

 

ListIterator는 컬렉션 요소에 접근할 때 한 방향으로만 이동하는 것이 아니라 양방으로 이동할 수 있습니다. 그래서 커서를 앞 뒤로 움직일 수 있도록 해당 메서드를 이용하여 커서를 움직이며 문제를 해결해나갔습니다.

 

ListIterator를 이용해 문제를 풀었지만 채점 결과 또 시간 초과가 났고,

마지막에 편집기에 입력되어있는 문자열을 출력해주기 위해 사용된 기존 for문을 향상된 for문을 이용하여 출력하니 정답을 맞출 수 있었습니다. 

 

코드

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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.ListIterator;
 
public class Main_BJ_1406_에디터 {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
 
        LinkedList<Character> list = new LinkedList<>();
        
        String command = br.readLine();
        
        for(int i=0;i<command.length();i++) {
            list.add(command.charAt(i));
        }
        
        ListIterator<Character> liter = list.listIterator();
        while (liter.hasNext()) {
            liter.next(); 
        }
 
        int M = Integer.parseInt(br.readLine());
        
        for(int i=0;i<M;i++) {
            String str = br.readLine();
            char com = str.charAt(0);
            if(com=='L') {
                if(liter.hasPrevious()) liter.previous();
            }
            else if(com=='D') {
                if(liter.hasNext()) liter.next();
            }
            else if(com=='B') {
                if(liter.hasPrevious()) { 
                    liter.previous(); 
                    liter.remove(); 
                }
            }
            else if(com=='P') {
                liter.add(str.charAt(2));
            }
        }
        
        for (char c : list) { 
            sb.append(c);
        } 
        
        System.out.println(sb.toString());
    }
 
}
cs