✏️ AC
사용 언어 : Java
레벨 : 골드 5
📎AC
🔎 문제 설명
선영이는 주말에 할 일이 없어서 새로운 언어 AC를 만들었다. AC는 정수 배열에 연산을 하기 위해 만든 언어이다. 이 언어에는 두 가지 함수 R(뒤집기)과 D(버리기)가 있다.
함수 R은 배열에 있는 수의 순서를 뒤집는 함수이고, D는 첫 번째 수를 버리는 함수이다. 배열이 비어있는데 D를 사용한 경우에는 에러가 발생한다.
함수는 조합해서 한 번에 사용할 수 있다. 예를 들어, "AB"는 A를 수행한 다음에 바로 이어서 B를 수행하는 함수이다. 예를 들어, "RDD"는 배열을 뒤집은 다음 처음 두 수를 버리는 함수이다.
배열의 초기값과 수행할 함수가 주어졌을 때, 최종 결과를 구하는 프로그램을 작성하시오.
📌 입력과 출력
입력 : 첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 최대 100이다.
각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어진다. p의 길이는 1보다 크거나 같고, 100,000보다 작거나 같다.
다음 줄에는 배열에 들어있는 수의 개수 n이 주어진다. (0 ≤ n ≤ 100,000)
다음 줄에는 [x1,...,xn]과 같은 형태로 배열에 들어있는 정수가 주어진다. (1 ≤ xi ≤ 100)
전체 테스트 케이스에 주어지는 p의 길이의 합과 n의 합은 70만을 넘지 않는다.
출력 : 각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.
⚒️ 풀이
Deque를 사용하면 간단하게 풀 수 있는 것처럼 보이는 문제이지만 생각보다 처리해야하는 예외적인 부분이 많아서 시행착오를 좀 겪었다.
1. 배열 입력이 숫자만 들어오는 게 아니라 [1,2,3,4] 이런식으로 [] 와 , 가 포함된 문자열이라는 점, 심지어 출력도 이런 포맷으로 해야 함
2. 빈 배열이 들어와도 error로 처리하는 것이 아니라 빈 배열인 상태에서 빼기를 시도했을 때만 error가 출력되야 한다는 점
3. 명령어를 수행하는 도중엔 배열을 뒤집지 않아도 Deque를 통해 앞이나 뒤를 빼면 되는데, 문제는 마지막 명령어를 수행한 뒤에도 뒤집어져 있는 상태이면 출력할 때도 뒤집어서 출력이 되어야 한다는 점
이 3가지 문제점 때문에 꽤 많은 시간을 소요했던 것 같다. 흑흑
import java.io.*;
import java.util.*;
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));
int testCase = Integer.parseInt(br.readLine()); // TestCase 개수
String[] function; // 명령어들을 하나씩 담을 배열
int arrLength; // 배열의 길이 (인데 나는 사용하지 않았음)
String str; // 배열이 문자열 형태로 들어오기 때문에 처리해줄 String 변수
Deque<Integer> deque; // 각 테스트케이스마다 명령어를 수행할 Deque
boolean isFirst; // 뒤집었는지 체크
boolean isError; // error 체크
for(int i = 0; i < testCase; i++) {
function = br.readLine().split("");
arrLength = Integer.parseInt(br.readLine());
// [] 를 제외한 문자열을 가져옴
str = br.readLine().replaceAll("[\\[|\\]]", "");
deque = new ArrayDeque<>();
isFirst = true;
isError = false;
// []를 없앴을 때 빈 문자열이 되지 않는 것만 split 처리
if(!str.equals("")) {
for (String s : str.split(",")) {
deque.add(Integer.parseInt(s));
}
}
for (String s : function) {
if (s.equals("R")) {
isFirst = !isFirst;
} else if (deque.isEmpty()) {
// D인데 Deque가 비어있으면 error 체크하고 테스트케이스 바로 종료
isError = true;
break;
} else {
// true 면 앞에서 빼고 false 이면 뒤에서 빼기
if(isFirst) {
deque.removeFirst();
} else {
deque.removeLast();
}
}
}
// 에러 체크 및, 뒤집기 체크 후 출력
if(isError) {
bw.write("error\n");
} else {
if(isFirst) {
bw.write(deque.toString().replaceAll(" ", "") + "\n");
} else {
List<Integer> list = new ArrayList<>(deque);
Collections.reverse(list);
bw.write(list.toString().replaceAll(" ", "") + "\n");
}
}
}
bw.close();
}
}
인텔리제이에서는 deque를 뒤집을 수 있는 메서드가 있기는 하던데 공식적으로 자바에서 지원하는 메서드는 아닌 것 같았다. (애초에 뒤집는게 가능하면 deque의 성질이 없어지는 느낌이기두 하고...) 그래서 그걸 좀 쉽게 처리하기 위해서 그냥 ArrayList를 사용해버렸고,, 뭔가 ArrayList를 쓰지 않고 풀어보고 싶어서 다른 방법도 시도해봤는데 코드가 너무 지저분해질 것 같아서 그냥 포기했다 ^0^!
처음에 문제를 봤을 땐 아 쉬운데? 했는데 풀어보니 아 .. 괜히 골드 문제가 아니네 싶었던 문제였다. 그래도 여러 시행착오 끝에 나오는 맞았습니다!! 는 아주 뿌듯하군용🥰
그리고 이건 tmi 인데 최대한 제가 생각한 테스트케이스들을 다 집어넣어보고 잘 동작해서 제출을 했는데 자꾸 틀렸습니다 가 나와서 대체.. 대체 오ㅐ?!?!???!?!!!! 라고 절규를 했는데 알고보니 뭐가 틀렸던 건 줄 아시나요 여러분?

ㅎㅎ error 오타남
'알고리즘' 카테고리의 다른 글
[백준/Java] #10986 나머지 합 (1) | 2025.01.15 |
---|---|
[백준/Java] #5427 불 (2) | 2024.12.26 |
[백준] #13300 방 배정, #1919 애너그램 만들기 (3) | 2024.12.06 |
[프로그래머스] 기초 문제 풀이 (조건에 맞게 수열 변하기 2, 1로 만들기, 문자열이 몇 번 등장하는지 세기) (1) | 2024.12.06 |
[백준/Java] #11659 구간 합 구하기 4, #11660 구간 합 구하기 5 (0) | 2024.11.25 |