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에서 첫 번째 원소를 제거하여 반환, 그 수를 순서대로 출력
- 큐가 비어있지 않을 때만 ',' 출력
'코딩 문제 풀기 ( Algorithm problem solving ) > 백준 온라인 저지 ( BOJ )' 카테고리의 다른 글
[백준(Baekjoon)][자바(java)] 1927 : 최소 힙 / 우선순위 큐 (0) | 2020.04.28 |
---|---|
[백준(Baekjoon)][자바(java)] 11279 : 최대 힙 / 우선순위 큐 (0) | 2020.04.28 |
[백준(Baekjoon)][자바(java)] 1021 : 회전하는 큐 / 큐, 덱 (0) | 2020.04.14 |
[백준(Baekjoon)][자바(java)] 10866 : 덱 / 큐, 덱 (0) | 2020.04.14 |
[백준(Baekjoon)][자바(java)] 1966 : 프린터 큐 / 큐, 덱 (0) | 2020.04.14 |