문제/백준
백준 1406번 에디터 [JAVA]
javaju
2021. 10. 20. 22:34
풀이 방법
해당 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 출력하는 문제였습니다.
저는 초기 편집기에 입력되어 있는 문자열을 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 |