문제
https://www.acmicpc.net/problem/1406
여담
처음에 LinkedList
를 사용해서 풀었더니 시간 초과가 발생했다. 아마 LinkedList
에서 원하는 위치를 찾아가는 시간이 O(N)이라 그런 것 같다.
풀이를 참고하니 ListIterator
라는 인터페이스를 사용해서 LinkedList
를 편리하게 탐색할 수 있다는 것을 알게 되었다. LinkedList
와 ListIterator
에 대해 공부하고 정리해야 되겠다..!
풀이
LinkedList
와 ListIterator
를 사용해서 풀이하면 된다.
이 문제는 ListIterator
의 사용법을 익히는 문제라고 볼 수 있다. 따라서 ListIterator
의 메소드를 조건에 맞게 적절하게 사용하면 된다.
우선 입력받은 문자열을 LinkedList
에 저장하고 listIterator()
메소드를 통해 ListIterator
객체를 생성한다. 그 후 입력된 명령어에 따라 다음의 과정을 수행하면 된다.
- 커서를 왼쪽으로 옮기기
iterator.previous()
- 이때, 왼쪽으로 옮길 수 있는지 확인하고 옮겨야 함 (
iterator.hasPrevious()
)
- 커서를 오른쪽으로 옮기기
iterator.next()
- 이때, 오른쪽으로 옮길 수 있는지 확인하고 옮겨야 함 (
iterator.hasNext()
)
- 커서 왼쪽에 있는 문자 삭제하기
- 커서를 앞으로 이동하기:
iterator.previous()
- 커서에 위치하는 문자 삭제하기:
iterator.remove()
- 커서를 앞으로 이동하기:
- 커서 왼쪽에 문자 추가하기
iterator.add(s)
코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int M = Integer.parseInt(br.readLine());
LinkedList<String> list = new LinkedList<>();
for (int i = 0; i < str.length(); i++) {
list.add(str.charAt(i) + "");
}
ListIterator<String> iterator = list.listIterator();
while (iterator.hasNext()) { // 커서 맨 뒤로 옮기기
iterator.next();
}
for (int i = 0; i < M; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
String cmd = st.nextToken();
switch (cmd) {
case "L": // 왼쪽으로 커서 이동
if (iterator.hasPrevious()) { // 이전 요소가 있다면
iterator.previous(); // 커서 위치를 왼쪽으로 이동
}
break;
case "D": // 오른쪽으로 커서 이동
if (iterator.hasNext()) { // 다음 요소가 있다면
iterator.next(); // 커서 위치를 오른쪽으로 이동
}
break;
case "B": // 왼쪽의 문자 삭제
if (iterator.hasPrevious()) { // 왼쪽에 문자가 있다면
iterator.previous(); // 커서를 왼쪽으로 이동하고
iterator.remove(); // 그 위치의 문자 삭제하기
}
break;
case "P": // 왼쪽에 문자 추가
String s = st.nextToken();
iterator.add(s);
break;
}
}
StringBuilder sb = new StringBuilder();
for (String s : list) {
sb.append(s);
}
System.out.println(sb.toString());
}
}
참고
https://minhamina.tistory.com/17
'Algorithm > 자료구조' 카테고리의 다른 글
[BOJ] 17298: 오큰수 (JAVA) (1) | 2024.04.07 |
---|---|
[BOJ] 6198: 옥상 정원 꾸미기 (JAVA) (0) | 2024.04.06 |
[BOJ] 2493: 탑 (JAVA) (0) | 2024.04.04 |
[BOJ] 5397: 키로거 (JAVA) (0) | 2024.04.03 |
[자료구조] 스택(Stack)이란? (0) | 2024.03.26 |