문제
https://www.acmicpc.net/problem/5397
여담
이 문제는 에디터 문제랑 거의 유사하다. 에디터 문제를 통해 ListIterator
를 다루는 방법을 배웠기 때문에 수월하게 풀 수 있었다!
풀이
에디터 문제와 마찬가지로 LinkedList
를 ListIterator
를 사용해서 풀이하면 된다.
입력한 문자열은 명령어와 문자가 섞인 채로 주어진다. 따라서 각 문자를 하나씩 확인하면서 문자라면 iterator
에 저장하고, 명령어라면 그에 맞는 명령을 수행하면 된다.
우선 LinkedList
객체에 listIterator()
메소드를 사용해서 ListIterator
객체를 생성한다. 그 후, 각 문자에 따라 다음의 과정을 반복한다.
- - 인 경우 (백스페이스)
- 이전 문자가 존재하는 경우:
iterator.hasPrevious()
- 커서를 왼쪽으로 이동하기:
iterator.previous()
- 현재 커서에 있는 문자 삭제하기:
iterator.remove()
- 이전 문자가 존재하는 경우:
- < 인 경우 (왼쪽 화살표)
- 이전 문자가 존재하는 경우:
iterator.hasPrevious()
- 커서를 왼쪽으로 이동하기:
iterator.previous()
- 이전 문자가 존재하는 경우:
- > 인 경우 (오른쪽 화살표)
- 다음 문자가 존재하는 경우:
iterator.hasNext()
- 커서를 오른쪽으로 이동하기:
iterator.next()
- 다음 문자가 존재하는 경우:
- 모두 아닌 경우 (알파벳 또는 숫자)
- 해당 문자 넣기:
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));
int n = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for (int t = 0; t < n; t++) {
String str = br.readLine();
LinkedList<Character> list = new LinkedList<>();
ListIterator<Character> iterator = list.listIterator();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
switch (c) {
case '-': // 문자 삭제하기
if (iterator.hasPrevious()) {
iterator.previous();
iterator.remove();
}
break;
case '<': // 왼쪽으로 이동
if (iterator.hasPrevious()) {
iterator.previous();
}
break;
case '>': // 오른쪽으로 이동
if (iterator.hasNext()) {
iterator.next();
}
break;
default:
iterator.add(c);
break;
}
}
for (Character c : list) {
sb.append(c);
}
sb.append("\n");
}
System.out.println(sb.toString());
}
}
'Algorithm > 자료구조' 카테고리의 다른 글
[BOJ] 17298: 오큰수 (JAVA) (1) | 2024.04.07 |
---|---|
[BOJ] 6198: 옥상 정원 꾸미기 (JAVA) (0) | 2024.04.06 |
[BOJ] 2493: 탑 (JAVA) (0) | 2024.04.04 |
[BOJ] 1406: 에디터 (JAVA) (0) | 2024.04.03 |
[자료구조] 스택(Stack)이란? (0) | 2024.03.26 |