반응형
https://www.acmicpc.net/problem/5430
[풀이과정]
처음엔 D가 나올 때까지 R의 개수를 세서, %2값이 1일 때만 뒤집는 연산을 수행했다. 당연히 시간초과가 났다.
그냥 뒤집은 상태라고 하면 뒤에서부터 출력하면 되는 문제였다.
Deque을 사용했고 뒤집은 상태인지 아닌지 구분해줄 변수를 사용했다.
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
/*
R - 순서를 뒤집는 함수
D - 첫 번째 수를 버리는 함수, 배열이 비어있을 때 사용되면 에러
함수를 조합하여 한 번에 사용
최종 결과 구하기
*/
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static int N;
static boolean isFront;
static String P;
static Deque<Integer> nums;
public static void main(String[] args) throws IOException{
int T = Integer.parseInt(br.readLine());
for(int t = 0; t < T; t++){
init();
//수행결과 출력
if(getResult()){
sb.append("[");
if(isFront){
pollFirst();
}
else{
pollLast();
}
sb.append("]").append("\n");
}
//에러 출력
else{
sb.append("error").append("\n");
}
}
/*
[출력]
각 테스트케이스에 대해서, 결과 출력.
에러가 발생하면 error 출력
*/
System.out.println(sb);
}
static void init() throws IOException{
/*
[입력]
1. 테스트케이스 T (T <= 100)
2. 함수 p (1 <= p길이 <= 100,000)
3. 배열에 들어있는 수의 개수 n (0 <= n <= 100,000)
4. 배열의 정수가 [x, ...] 형태로 주어짐 (1 <= x <= 100)
전체 테스트케이스에 주어지는 p의 길이의 합과 n의 합은 70만을 넘지 않음.
*/
//함수
P = br.readLine();
//배열
N = Integer.parseInt(br.readLine());
String numStr = br.readLine();
nums = new ArrayDeque<>();
if(N > 0) {
numStr = numStr.substring(1, numStr.length() - 1);
String[] numArr = numStr.split(",");
for (String num : numArr) {
nums.add(Integer.parseInt(num));
}
}
isFront = true;
}
static boolean getResult(){
int cntR = 0;
//함수 탐색
for(char command : P.toCharArray()){
//뒤집기이면
if(command == 'R'){
R();
}
//삭제이면
else if(command == 'D'){
//비어있으면 error
if(nums.isEmpty()){
return false;
}
D();
}
}
return true;
}
//뒤집기
static void R(){
isFront = !isFront;
}
static void D(){
if(isFront){
nums.removeFirst();
}
else{
nums.removeLast();
}
}
static void pollFirst(){
int size = nums.size();
for(int s = 0; s < size; s++){
if(s == size-1){
sb.append(nums.pollFirst());
continue;
}
sb.append(nums.pollFirst()).append(",");
}
}
static void pollLast(){
int size = nums.size();
for(int s = 0; s < size; s++){
if(s == size-1){
sb.append(nums.pollLast());
continue;
}
sb.append(nums.pollLast()).append(",");
}
}
}
반응형
'백준 > 구현' 카테고리의 다른 글
[백준] 1700 : 멀티탭 스케줄링 (JAVA) (1) | 2024.10.03 |
---|---|
[백준] 1202 : 보석도둑 (JAVA) (0) | 2024.10.03 |
[백준] 15961 : 회전초밥 (JAVA) (2) | 2024.09.27 |
[백준] 30023 : 전구 상태 바꾸기 (0) | 2024.09.02 |
[백준] 14499 : 주사위 굴리기 (0) | 2023.09.08 |