문제

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


코드

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
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[] input = br.readLine().toCharArray();

LinkedList<Character> list = new LinkedList<>();
for (char c : input) {
list.add(c);
}

ListIterator<Character> it = list.listIterator();
while (it.hasNext()) {
it.next();
}

int n = Integer.parseInt(br.readLine());

while (n-- > 0) {
String command = br.readLine();

switch (command) {
case "L" :
if (it.hasPrevious()) {
it.previous();
}
break;
case "D" :
if (it.hasNext()) {
it.next();
}
break;
case "B" :
if (it.hasPrevious() && !list.isEmpty()) {
it.previous();
it.remove();
}
break;
default:
it.add(command.charAt(2));
break;
}
}

StringBuilder sb = new StringBuilder();
for (char c : list) {
sb.append(c);
}

System.out.println(sb);
}
  • 이 문제는 로직보다 걸리는 시간이 문제였다.
  • 처음엔 LinkedList를 그대로 사용해 add, remove를 했지만 시간초과로 인해 ListIterator을 이용해 해결했다.

ListIterator

  • List를 양방향으로 탐색하고, 루프 중에 리스트를 수정하고, 리스트에서 현재 위치를 가져올 수 있다.
  • 커서는 previous()로 리턴되는 원소와 next()로 리턴되는 원소 사이에 존재한다.
1
2
                    Element(0)   Element(1)   Element(2)   ... Element(n-1)
cursor positions: ^ ^ ^ ^ ^
  • remove()와 set()를 호출해도 커서의 위치는 움직이지 않는다.
  • remove() 호출 시 next()혹은 preivous()에 의해 리턴된 마지막 요소를 리스트에서 제거한다.
1
2
3
4
5
6
case "B" :
if (it.hasPrevious() && !list.isEmpty()) {
it.previous();
it.remove();
}
break;

결과


참고 사이트