[백준(Baekjoon)][자바(java)] 5430 : AC / 큐, 덱

728x90

https://www.acmicpc.net/problem/5430

 

5430번: AC

문제 선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다. 함수 R은 배열에 있는 숫자의 순서를 뒤집는 함수이고, D는 첫 번째 숫자를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다. 함수는 조합해서 한 번에 사용할 수 있다. 예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다.

www.acmicpc.net

 

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.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) );
        
		LinkedList<String> deque;
        
		StringTokenizer st;
		String p = ""; 
        
		boolean isReverse;
		int i, n, t = Integer.parseInt( br.readLine() );
        
		loop:
		while( t-- > 0 ) {
        
			deque = new LinkedList<>();
			isReverse = false;
            
			p = br.readLine().replace("RR", "");
			n = Integer.parseInt( br.readLine() );
			st = new StringTokenizer( br.readLine().replace("[", "").replace("]", ""), "," );
            
			for( i = 0; i < n; i++ ) 
				deque.add( st.nextToken() );
                
			for( i = 0; i < p.length(); i++ ) {
				if( p.charAt(i) == 'R' ) {
					if( isReverse )   isReverse = false;
					else		  isReverse = true;
				}
				if( p.charAt(i) == 'D' ) {
					if( deque.isEmpty() ) {
						bw.write("error\n");
						continue loop;
					}
					if( isReverse )	  deque.pollLast();
					else		  deque.pollFirst();
				}		
			}
            
			bw.write("[");
			while( !deque.isEmpty() ) {
				if( isReverse )   bw.write( deque.pollLast() );
				else		  bw.write( deque.pollFirst() );
				if( !deque.isEmpty() ) bw.write(",");
			}
			bw.write("]\n");
		}
        
		bw.flush();
        
		bw.close();
	}
}

 

 

< 입력 >

-  BufferedReader로 입력 받음

-  t (int) : 테스트 케이스

-  p (String) : 수행할 함수 ( 뒤집기 연산 두 번하면 그대로이므로 'RR' 없애기 )

-  n (int) : 배열에 들어있는 수의 개수

-  st (StringTokenizer) : 배열 ( '[', ']' 괄호 없애고 ',' 구분자로 자름 ) 

-  deque (LinkedList) : st에서 nextToken()으로 데이터 넣기 ( n번의 횟수 만큼 )

-  isReverse (Boolean) : 배열 자체를 뒤집지 않고 뒤집음/뒤집지않음 의 상태 정보만 저장 

 

< 연산 >

-  p 문자열에서 한 글자씩 탐색

  'R' 일 때, isReverse 가 true일 때 false로, false일 땐 true로 상태 변경

  'D' 일 때, deque가 비어있으면 'error' 출력,

              그렇지 않으면 isReverse 일 때 deque의 마지막 원소 제거, !isReverse 일 때 deque의 첫 번째 원소 제거

 

< 출력 >

-  BufferedWriter로 출력함

-  앞, 뒤로 괄호 출력

-  isReverse 가 true 일 때, deque에서 마지막 원소를 제거하여 반환, 그 수를 순서대로 출력

   isReverse 가 false 일 때, deque에서 첫 번째 원소를 제거하여 반환, 그 수를 순서대로 출력

-  큐가 비어있지 않을 때만 ',' 출력

 

반응형