본문 바로가기
Algorithm/Baekjoon For.Java

1406 : 에디터

by Jinny zinny 2023. 3. 12.

진짜 그지 같다

실버 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