본문 바로가기
Algorithm

백준 5430번 <AC>

by seungh2 2022. 5. 4.

백준 알고리즘 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

댓글