[1406번] 에디터

알쓸코딩·2024년 3월 9일
0

코테 문제들

목록 보기
103/113

이 문제는
1 : ArrayList, System.out.print -> 시간초과
2 : LinkedList, sout -> 시간초과
3 : ArrayList, sout, Iterator -> 시간초과
4 : LinkedList, sout, Iterator -> 시간초과
5 : LinkedList, BufferedWriter, Interator -> 통과

결론적으로 LinkedList랑 bw랑 Iterator 모두 써야 통과다.

리스트 사용

import java.io.*;
import java.util.LinkedList;
import java.util.ListIterator;

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));
		String s = br.readLine();

		int M = Integer.parseInt(br.readLine());

		LinkedList<Character> A = new LinkedList<>();
		for (int i = 0; i < s.length(); i++) {
			A.add(s.charAt(i));
		}

		ListIterator<Character> list = A.listIterator();

		while (list.hasNext()) {
			list.next();
		}

		for (int i = 0; i < M; i++) {
			String ss = br.readLine();
			char c = ss.charAt(0);

			switch (c) {
				case 'L':
					if (list.hasPrevious()) list.previous();
					break;
				case 'D':
					if (list.hasNext()) list.next();
					break;
				case 'B':
					//remove()는 next()나 previous()에 의해 반환된 가장 마지막 요소를 리스트에서 제거함
					if (list.hasPrevious()) {
						list.previous();
						list.remove();
					}
					break;
				case 'P':
					list.add(ss.charAt(2));
					break;
			}
		}

		for (Character chr : A) {
			bw.write(chr);
		}

		bw.flush();
		bw.close();

	}
}

스택 사용

스택을 쓰는 방법도 존재한다.
근데 중요한 게 bw 안 써주고 sout 쓰면 시간초과 난다.
bw 써주자

import java.io.*;
import java.util.Stack;

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));
		String s = br.readLine();

		int M = Integer.parseInt(br.readLine());

		Stack<Character> left = new Stack<>();
		Stack<Character> right = new Stack<>();

		for (int i = 0; i < s.length(); i++) {
			left.push(s.charAt(i));
		}

		for (int i = 0; i < M; i++) {
			String ss = br.readLine();
			char c = ss.charAt(0);

			switch (c) {
				case 'L':
					if (!left.isEmpty()) right.push(left.pop());
					break;
				case 'D':
					if (!right.isEmpty()) left.push(right.pop());
					break;
				case 'B':
					if (!left.isEmpty()) left.pop();
					break;
				case 'P':
					left.push(ss.charAt(2));
					break;
			}
		}

		while (!left.isEmpty()) {
			right.add(left.pop());
		}

		while (!right.isEmpty()) {
			System.out.print(right.pop());
		}


	}
}

profile
알면 쓸데있는 코딩 모음!

0개의 댓글