Java

[백준 1406] 에디터 (JAVA)

iheeeee6-6 2023. 3. 19. 01:21
728x90

 

https://www.acmicpc.net/problem/1406

 

1406번: 에디터

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수

www.acmicpc.net

 

 

계속 시간초과가 나서 힘들었던 문제였다...

결국 구글에 검색을 해봤는데  

1) ListIterator<String> iter = origin.listIterator(); 을 써서 커서를 나타내야한다.

2) BufferedWriter로 출력해야한다.

- System.out  vs BufferedWriter vs StringBuilder 속도 차이

  • 숫자 1000개 출력 * 10번 ( 단위 : ns )
  • System.out => 14278900 14603400 14476599 15037400 16803600 15298800 14787999 13763000 13420000 13964200
    • 평균 : 14,643,390 ns
  • BufferedWriter => 2219700 2440499 2130399 1895800 1884599 2525300 2500900 3079399 2478800 1984099
    • 평균 : 2,313,950 ns
  • StringBuilder => 619600 945899 762501 1083500 800900 792499 685100 734099 875701 897799
    • 평균 : 819,760 ns

(출처 : https://chb2005.tistory.com/73)

 

 

두 가지 사항을 적용하면 해결된당!!

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.ListIterator;

public class Main {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		String[] arr = br.readLine().split("");
		LinkedList<String> list = new LinkedList<>(Arrays.asList(arr));
		int m = Integer.parseInt(br.readLine());
		ListIterator<String> iter = list.listIterator();
		while(iter.hasNext()) {
			iter.next();
		}
		for (int i = 0; i < m; i++) {
			String[] input = br.readLine().split(" ");
			if (input[0].equals("P")) {
				iter.add(input[1]);
			} else if (input[0].equals("L")) {
				if (iter.hasPrevious())
					iter.previous();
			} else if (input[0].equals("D")) {
				if (iter.hasNext())
					iter.next();
			} else if (input[0].equals("B")) {
				if (iter.hasPrevious()) {
					iter.previous();
					iter.remove();
				}
			}
		}

		for(String str : list) {
			bw.write(str);
		}
		
		bw.flush();
		bw.close(); 
	}

}

'Java' 카테고리의 다른 글

[백준 20438] 출석체크 (JAVA)  (0) 2023.03.22
[백준 14889] 스타트와 링크 (JAVA)  (0) 2023.03.20
[백준 1629] 곱셈 (JAVA)  (0) 2023.03.12
[백준 2740] 행렬 곱셈 (JAVA)  (0) 2023.03.12
[백준 10830] 행렬 제곱(JAVA)  (0) 2023.03.12