백준 알고리즘 5430번
https://www.acmicpc.net/problem/5430
5430번: AC
각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.
www.acmicpc.net
5430번
AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는R 뒤집기와 D 버리기가 있다.
- R : 배열에 있는 수의 순서를 뒤집는다.
- D : 첫 번째 수를 버린다. 만약 배열이 비어있는데 D를 사용하면 error 가 발생한다.
- RDD -> 배열에 있는 수의 순서를 뒤집은 후, 처음 두 수를 버린다.
배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하여라.
입력으로 첫 줄에 테스트 케이스의 개수 testcase가 주어진다.
각 테스트 케이스는 첫 줄에 수행할 함수 op가 주어지고 다음 줄에 배열에 들어있는 수의 개수 n이 주어지고 그 다음 줄에 배열에 대한 정보가 주어진다.
출력으로 각 테스트 케이스에서 함수를 수행했을 때, 최종 결과를 출력하면 된다.
문제 해결
맨 앞과 맨 뒤로 접근이 가능한 Deque 자료구조를 사용하여 문제를 풀 수 있다.
R 연산은 reverse 변수를 사용하여 체크한다.
D 연산은 reverse 변수를 보고 pollLast()를 사용할지, pollFirst()를 사용할지 결정한다.
reverse 변수가 true라면 pollLast()를 사용하고, false라면 pollFirst()를 사용한다.
이때 고려해야 할 것은 배열에 숫자가 아무것도 없을 때이다.
이때는 D연산이 들어오면 error이다. R연산만 있다면 []를 출력하면 된다.
코드
package bj5430;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int testcase = Integer.parseInt(br.readLine());
for (int i = 0; i < testcase; i++) {
String op = br.readLine();
int n = Integer.parseInt(br.readLine());
String temp = br.readLine();
if (n == 0) {
AC_zero(op, n);
continue;
}
temp = temp.replace("[", "");
temp = temp.replace("]", "");
String[] inArr = temp.split(",");
int[] number = new int[n];
for (int j = 0; j < n; j++) {
number[j] = Integer.parseInt(inArr[j]);
}
AC(op, n, number);
}
}
public static void AC_zero(String op, int n) {
int len = op.length();
for (int i = 0; i < len; i++) {
if (op.charAt(i) == 'D') {
System.out.println("error");
return;
}
}
System.out.println("[]");
}
public static void AC(String op, int n, int[] number) {
StringBuffer sb = new StringBuffer();
Deque<Integer> deque = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
deque.add(number[i]);
}
boolean reverse = false;
int len = op.length();
for (int i = 0; i < len; i++) {
if (op.charAt(i) == 'R') {
reverse = !reverse;
} else if (op.charAt(i) == 'D') {
if (deque.isEmpty()) {
System.out.println("error");
return;
}
if (reverse) {
deque.pollLast();
} else {
deque.pollFirst();
}
}
}
String answer = "[";
while (!deque.isEmpty()) {
if (reverse) {
sb.append(deque.pollLast());
} else {
sb.append(deque.pollFirst());
}
if (deque.isEmpty()) {
break;
} else {
sb.append(",");
}
}
sb.append("]");
answer += sb.toString();
System.out.println(answer);
}
}
결과
시간초과가 뜨길래 StringBuffer를 사용했다.
728x90
'Algorithm' 카테고리의 다른 글
백준 1629번 <곱셈> (0) | 2022.05.09 |
---|---|
백준 5014번 <스타트링크> (0) | 2022.05.06 |
백준 4949번 <균형잡힌 세상> (0) | 2022.05.04 |
백준 3986번 <좋은 단어> (0) | 2022.05.04 |
백준 7562번 <나이트의 이동> (0) | 2022.05.03 |
댓글