티끌모아 태산

백준 5430번: AC 본문

코딩/코딩테스트

백준 5430번: AC

yesman9 2024. 7. 23. 14:56

 

실패한 코드.

Queue를 사용하여 정수 배열을 입력받았고,
명령이 R이면 Stack을 이용해서 Queue를 뒤집었다.
그 결과, 시간 초과가 떴다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class Main {
	static Queue<String> queue = null;

	public static void main(String[] args) throws IOException {
		// 입력
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringBuilder sb = new StringBuilder();

		// RDD
		int t = Integer.parseInt(br.readLine());

		// 테스트케이스만큼 반복
		for (int i = 0; i < t; i++) {
			// 입력
			String methodStr = br.readLine(); // 메소드 순서 입력
			int n = Integer.parseInt(br.readLine()); // 배열 길이 입력. 실제 사용하지 않는 변수
			String arrStr = br.readLine(); // 정수 배열 입력

			// 파싱
			char[] methodArr = methodStr.toCharArray(); // 메소드 순서 파싱
			String[] numArr = arrStr.replace("[", "").replace("]", "").split(","); // 정수 배열 파싱

			// 배열을 큐에 담기
			queue = new LinkedList<String>();
			for (String s : numArr) {
				if (s != null && !s.equals("")) {
					queue.add(s);
				}
			}

			// 명령 갯수만큼 반복
			for (char command : methodArr) {
				String s = runMethod(command);

				// error 예외처리
				if (s.equals("error")) {
					sb.append(s + "\n");
					break;
				}
			}

			// 빈 queue 예외처리
			if (queue.isEmpty()) {
				continue;
			}

			// 큐 출력
			sb.append(queue.toString().replace(" ", "") + "\n");

			// 큐 초기화
			queue.clear();
		}
		bw.write(sb.toString());
		bw.flush();
		bw.close();
		br.close();
	}

	private static String runMethod(char command) {
		String result = "";
		switch (command) {
		case 'R':
			// 스택을 사용해 큐 뒤집기
			Stack<String> s = new Stack<String>();

			while (!queue.isEmpty()) {
				s.push(queue.poll());
			}

			while (!s.isEmpty()) {
				queue.add(s.pop());
			}
			break;
		case 'D':
			// 빈 큐일 때 error
			if (queue.isEmpty()) {
				result = "error";
			}
			// 아니면 맨 앞의 원소 제거
			else {
				result = queue.remove();
			}
			break;
		}
		return result;
	}
}

 

성공한 코드.
R명령 입력 시, 실제로 queue를 뒤집는 것이 아닌, isReversed라는 뒤집힘 플래그를 true로 저장한다.
뒤집힘 플래그가 true일 때 D명령 입력이 들어오면, 맨 뒤 원소를 삭제한다.
이를 위해 queue가 아니라 dequeue를 사용한다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayDeque;
import java.util.Deque;

public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

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

		for (int i = 0; i < t; i++) {
			// 입력
			String cmdStr = br.readLine();
			int n = Integer.parseInt(br.readLine());
			String arrStr = br.readLine();

			// 정수 배열 파싱
			String[] elements = arrStr.replace("[", "").replace("]", "").split(",");

			// 덱 입력
			Deque<Integer> deque = new ArrayDeque<>();
			if (n > 0) {
				for (String element : elements) {
					deque.add(Integer.parseInt(element));
				}
			}

			boolean isReversed = false; // 뒤집어졌는지 플래그
			boolean isError = false; // 에러 플래그

			// 명령 처리
			for (char cmd : cmdStr.toCharArray()) {
				if (cmd == 'R') {
					isReversed = !isReversed; // 현재 뒤집힘 플래그의 역을 저장
				} else if (cmd == 'D') {
					if (deque.isEmpty()) {
						isError = true;
						break;
					}
					if (isReversed) { // 뒤집힌 상태면
						deque.removeLast(); // 맨 뒤의 원소 제거
					} else { // 뒤집히지 않은 상태면
						deque.removeFirst(); // 맨 앞의 원소 제거
					}
				}
			}

			// 결과 출력
			if (isError) {
				bw.write("error\n");
			} else {
				StringBuilder sb = new StringBuilder();
				sb.append("[");

				while (!deque.isEmpty()) {
					if (isReversed) { // 역순 출력
						sb.append(deque.removeLast());
					} else { // 정순 출력
						sb.append(deque.removeFirst());
					}
					if (!deque.isEmpty()) {
						sb.append(",");
					}
				}

				sb.append("]");
				bw.write(sb.toString() + "\n");
			}
		}

		bw.flush();
		bw.close();
		br.close();
	}
}

'코딩 > 코딩테스트' 카테고리의 다른 글

백준 10026번: 적록색약  (0) 2024.07.30
백준 7569번: 토마토  (0) 2024.07.23
백준 11286번: 절댓값 힙  (0) 2024.07.02
백준 6064번: 카잉 달력  (0) 2024.07.02
백준 5525번: IOIOI  (0) 2024.06.25