문제
선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.
함수 R은 배열에 있는 수의 순서를 뒤집는 함수이고, D는 첫 번째 수를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.
함수는 조합해서 한 번에 사용할 수 있다. 예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다. 예를 들어, "RDD"는 배열을 뒤집은 다음 처음 두 수를 버리는 함수이다.
배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 최대 100이다.
각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어진다. p의 길이는 1보다 크거나 같고, 100,000보다 작거나 같다.
다음 줄에는 배열에 들어있는 수의 개수 n이 주어진다. (0 ≤ n ≤ 100,000)
다음 줄에는 [x1,...,xn]과 같은 형태로 배열에 들어있는 정수가 주어진다. (1 ≤ xi ≤ 100)
전체 테스트 케이스에 주어지는 p의 길이의 합과 n의 합은 70만을 넘지 않는다.
출력
각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.
풀이
# 문제 해결
우선 R이 나오면 뒤집기를 해야하는데 처음에 큐에서 순서대로 빼고 스택에 담아뒀다가 다시 큐에 집어넣는 복잡한 작업을 하였더니 시간초과가 났다. 그래서 isReverse 변수를 생성해서 시간 초과 문제를 해결하였다.
그리고 n의 길이가 0이고, p 함수에 D가 포함되어있지 않은 상황을 고려하지 않아 계속 틀렸다. 이 문제를 해결하기 위해 추가 작업을 해주었다.
<스택/큐>
1. 주어진 형식 대로 값 입력받기
2. R일 때, 큐에 있는 값들을 넣고 빼는 작업을 하지 않기 위해 isReverse 변수를 생성
+ (isReverse는 기본으로 true 설정하였음, R이 나오면 false로. 그러면 isReverse가 false면 반대로 뒤집혔다고 생각하고 pollLast() isReverse가 true이면 안 뒤집힌거니까 pollFirst().)
3. 일단 deque를 큐로 사용하였고, 주어진 배열의 값에서 " [ " , " ] " , " , " 를 제거하여 큐에 삽입
4. 그리고 주어진 함수 p 값을 배열에 담아 for문을 돌림
5. 그 for문 안에서 R이 나오면 isReverse를 반대로
6. D가 나올 때, 만약 큐가 비어있으면 isError를 false 처리하고 반복문을 탈출하게 하고, 큐가 비어있지 않으면 2번과 같이 isReverse 값을 토대로 poll 처리를 하였다.
7. 그리고 최종 queue를 isReverse 값을 기반으로 배열에 넣어주었고 이때 isError의 값을 통해 에러면 error 출력, 에러가 아니면 공백 제거 작업을 해주었다.
8. 마지막으로 주어진 배열의 길이가 0이고, D가 포함되어있지 않으면 []를 출력하도록 따로 처리하였다. 이를 처리하지 않으면 error가 뜨기 때문.
솔직히 지금 코드를 보면 조금 더 쉽게 구현할 수 있을 거 같은데 복잡하게 짠 거 같다. 다시 한 번 풀면서 코드를 다시 정리해봐야겠다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.StringTokenizer;
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));
int T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
boolean isError = true;
boolean isReverse = true;
String p = br.readLine();
int n = Integer.parseInt(br.readLine());
String input = br.readLine();
// 우선 input에 있는 정수들 큐에 담아주기
ArrayDeque<Integer> queue = new ArrayDeque<>();
StringTokenizer st = new StringTokenizer(input, "[|]|,");
while (st.hasMoreTokens()) {
queue.addLast(Integer.parseInt(st.nextToken()));
}
String[] arr = p.split("");
for (String str : arr) {
if (str.equals("R")) {
isReverse = !isReverse;
} else {
if (queue.isEmpty()) {
isError = false;
break;
}
if (!isReverse) {
queue.pollLast();
} else {
queue.pollFirst();
}
}
}
int[] result = new int[queue.size()];
if (!isReverse) {
for (int k = 0; k < result.length; k++) {
result[k] = queue.pollLast();
}
} else {
for (int k = 0; k < result.length; k++) {
result[k] = queue.pollFirst();
}
}
String str = "";
if (isError) {
str = Arrays.toString(result).replaceAll(" ", "");
} else {
str = "error";
}
if (n == 0 && !p.contains("D")) {
str = "[]";
}
bw.write(str + "\n");
}
bw.flush();
bw.close();
}
}
'코테' 카테고리의 다른 글
[백준] 2468번 안전 영역 - JAVA (1) | 2024.11.13 |
---|---|
[백준] 4963번 섬의 개수 - JAVA (0) | 2024.11.09 |
[백준] 4949번 균형 잡힌 세상 - JAVA (0) | 2024.11.08 |
[백준] 1764번 듣보잡 - JAVA (2) | 2024.11.07 |