BOJ 5430번 AC 문제 자바(java) 풀이
문제 정리
- AC에는 정수 배열을 위한 두 가지 함수가 있다.
R(뒤집기) : 배열에 있는 숫자 순서를 뒤집는다.
D(버리기) : 첫 번째 숫자를 버린다.
- RDD 처럼 함수를 바로 이어서 사용할 수 있다. 한 번 뒤집은 다음 두개의 숫자를 버린다.
- 함수 실행 후, 최종 결과를 구하여라
문제 풀이
수를 실제로 뒤집고 반복한다면 시간초과가 나게 될것입니다.
그러므로 deque를 이용하여 앞 뒤에서 숫자를 지워줍니다.
- 파싱하는 것이 중요합니다. 숫자는 한자리수가 아니라 최대 100,000임을 인지해야 합니다.
이것 때문에 런타임 에러를 많이 봤습니다..ㅠㅠ
- 배열에 주어진 수가 하나도 없을때 함수에 D가 포함되어 있다면 에러를 표시합니다.
- 그렇지 않다면 '['와 ']'를 잘라내고 ','를 기준으로 parsing하여 deque에 넣습니다.
- 그리고 R에 따라서 수를 앞, 뒤로 뺍니다. 만약에 빼려는데 deque가 비었다면 error를 출력합니다.
- error 없이 정상적으로 모두 실행했다면 출력형식에 맞게 deque에서 꺼내서 출력합니다.
백준 5430번 AC 자바 소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;
import java.util.StringTokenizer;
class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringTokenizer st = null;
for(int tc=1; tc<=T; tc++) {
String cmdd = br.readLine();
char[] cmd = cmdd.toCharArray();
int n = Integer.parseInt(br.readLine());
Deque<String> dq = new LinkedList<>();
String input = br.readLine();
input = input.substring(1, input.length()-1);
if(n != 0)
st = new StringTokenizer(input, ",");
else {
// 배열에 주어진 수가 없는데 빼려하면 error
// 빼려하지 않으면 "[]" 출력
if(cmdd.contains("D"))
System.out.println("error");
else
System.out.println("[]");
continue;
}
for(int i=0; i<n; i++)
dq.add(st.nextToken());
// true면 정방향 -> 앞에서 지움
// false: 역방향 -> 뒤에서 지움
boolean r = true;
boolean errorFlag = false;
for(int i=0; i<cmd.length; i++) {
// 방향 바꾸기
if(cmd[i] == 'R')
r = !r;
else {
// 뺄게 없으면 오류
if(dq.isEmpty()) {
errorFlag = true;
break;
}
// 정방향 이면 앞에서 빼기
if(r)
dq.pollFirst();
else
dq.pollLast(); // 역방향이면 뒤에서 빼기
}
}
// 에러가 안났으면 남은 수 출력
if(!errorFlag) {
System.out.print("[");
if(r) {
while(dq.size() > 1)
System.out.print(dq.pollFirst() + ",");
}
else {
while(dq.size() > 1)
System.out.print(dq.pollLast() + ",");
}
if(dq.size() != 0)
System.out.print(dq.getFirst());
System.out.println("]");
}
else {
System.out.println("error");
}
}
}
}