진짜 그지 같다
실버 2에서 왜 통과를 못하지
방금 푼 따끈따끈한 코드긴 한데,
이 문제에서 실수한 점은 2가지
우선 StringBuffer를 이용해서 문제를 해결하려 했다가, 안 되서 정석적인 접근법인 LinkedList를 이용해서 시도를 하려고 했다.
근데 두가지 방법 모두 실패를 했다.
이유는 바로 Iterator를 이용하지 않았다
각 리스트의 원소에 접근할 때, 반복자를 사용하지 않으면 처음부터 Search를 한다.
그러나 반복자를 사용했을 경우, 해당 원소에서 추가적인 명령을 기다린다.
그러나 Iterator를 사용했을 경우, 이전 원소로 커서를 옮길 수 없다
그래서 양방향 반복자인 ListIterator를 사용해서 문제를 풀었다.
ListIterator는 솔직히 모르는 부분이라 구글링을 했다
이 부분에 대해서는 추가적으로 ListIterator에 대해서 링크 및 정리를 한번 더 할 예정이다
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] input = br.readLine().split("");// 최초 문자열 입력
LinkedList<String> strlst=new LinkedList(Arrays.asList(input));//문자열을 넣을 List 생성
ListIterator iter=strlst.listIterator();//ListIterator로 양방향 반복자 생성
while(iter.hasNext()) {
iter.next();
}//반복자를 끝까지 밀어줌
int M = Integer.parseInt(br.readLine());//명령어의 갯수
for(int i=0;i<M;i++)//횟수대로 반복
{
String Command=br.readLine();//명령어 입력
if(Command.equals("L")) {
if(iter.hasPrevious()) {
iter.previous();
}
} else if(Command.equals("D")) {
if(iter.hasNext()) {
iter.next(); // 에러를 시험하기 위한 코드가 있다면 에러 가능성
}
} else if(Command.equals("B")) {
if(iter.hasPrevious()) {
iter.previous();
iter.remove();
}
} else {
String[] ap=Command.split(" ");
iter.add(ap[1]);
}
}
br.close();
for(String i:strlst)
{
bw.write(i);
}
bw.flush();
bw.close();
}
}
반응형
'Algorithm > Baekjoon For.Java' 카테고리의 다른 글
1351 : 무한 수열 (0) | 2023.03.16 |
---|---|
5397 : 키로거 (0) | 2023.03.13 |
1013 : Contact (0) | 2023.03.12 |
15312 : 이름 궁합 (0) | 2023.03.11 |
13300 : 방 배정 (0) | 2023.03.10 |