처음 문제를 읽고난 뒤에 요소를 추가/삭제 하는 횟수가 많다고 판단하여 이에 유리한 자료구조인 링크드 리스트(Linked-List) 구조를 선택하였다.
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
public class Main{
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int testCase = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for(int i=0; i < testCase; i++){
char[] chars = br.readLine().toCharArray();
int cursor = 0;
List<Character> li = new LinkedList<>();
for(int j = 0; j < chars.length; j++){
char ch = chars[j];
if(ch == '<'){
cursor = cursor > 0 ? cursor - 1 : 0;
continue;
}else if(ch == '>'){
cursor = cursor < li.size() ? cursor + 1 : li.size();
continue;
}else if(ch == '-'){
if(li.size() >= 1 && cursor > 0){
li.remove(cursor-1);
}
continue;
}
li.add(cursor,ch);
cursor++;
}
String res = li.stream().map(String::valueOf).collect(Collectors.joining());
sb.append(res).append('\n');
}
br.close();
System.out.println(sb);
}
}
계속 IndexOutOfBounds 런타임 에러가 발생하였다. 어느 부분에서 발생하는지 조차 가늠이 안된다.
결국엔, 제한시간 1시간을 초과하여 다른 유저의 풀이를 참고하게 되었다. 참고해보니, 커서를 정수값으로 사용하지 않고, 웹페이지의 뒤로가기/앞으로 가기와 같이 Stack 2개를 사용하여 구현할 수 있다는 것을 깨달았다.
최근 기능들을 구현하거나 알고리즘 문제를 풀면서 공통적으로 나타나는 습관 중 하나가 보이기 시작했다.
한 방식으로 구현하고자 마음 먹으면, 그 방식으로만 구현하려고 하다보니 사고가 좁아진다는 생각이 들었다.
이번을 계기로 알고리즘 문제 풀이 또는 프로젝트 기능 구현 시에 다양한 방법으로 접근할 수 있다라는 생각을 잊지 말아야 겠다.
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
import java.io.BufferedReader;
import java.io.BufferedWriter;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int testCase = Integer.parseInt(br.readLine());
for(int i=0; i<testCase; i++) {
String line = br.readLine();
Stack<Character> prevStack = new Stack<>();
Stack<Character> nextStack = new Stack<>();
for(int j=0; j<line.length(); j++) {
char ch = line.charAt(j);
if(ch == '<') {
if(!prevStack.isEmpty()) {
nextStack.push(prevStack.pop());
}
}else if(ch == '>') {
if(!nextStack.isEmpty()) {
prevStack.push(nextStack.pop());
}
}else if(ch == '-') {
if(!prevStack.isEmpty()) {
prevStack.pop();
}
}else {
prevStack.push(line.charAt(j));
}
}
while(!nextStack.isEmpty()) {
prevStack.push(nextStack.pop());
}
for(int k=0; k<prevStack.size(); k++) {
bw.write(prevStack.get(k));
}
bw.write("\n");
}
bw.flush();
bw.close();
}
}