Notice
Recent Posts
Recent Comments
Link
티끌모아 태산
백준 5430번: AC 본문
실패한 코드.
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 |