코딩테스트/백준
[백준 5430] AC (G5)
34suuuuu
2025. 2. 21. 23:06
📍 문제
https://www.acmicpc.net/problem/5430
📍 문제 풀이
가장 단순하게 생각할 수 있는 방법은 배열을 뒤집는 방식이 것 같다
하지만 실제로 배열로 구현해봤을 때는 아래와 같이 시간초과가 났다
그렇다면,, 직접 뒤집는게 아니라 어디가 앞인지만 확인할 수 있으면 되는거 아닌가?
그렇다면 양방향으로 데이터에 접근이 가능한 구조가 필요할 것이고 그럼 Deque를 생각할 수 있었다
`boolean` 타입의 `reverse`를 통해서 R 연산을 처리하게 된다
만약에 원본의 상태라면 `reverse = false`이기 때문에 D 연산에 대해서 `pollFirst()`로 맨 앞의 원소를 삭제한다.
반대로 R 연산을 처리한 뒤의 `reverse = true` 상태라면 D 연산에 대해서 `pollLast()`로 맨 뒤의 원소를 삭제한다.
연산을 모두 끝마친 뒤에도 마찬가지로 reverse 값에 따라서 출력 방법을 다르게한다.
`reverse = false`라면 맨 앞에서부터 출력해야하므로 `removeFirst()`로 값을 출력한다.
`reverse = true`라면 반대로 맨 뒤에서부터 출력해야하므로 `removeLast()`로 값을 출력한다.
📍 전체 코드
- Deque 이용한 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;
public class boj_5430 {
static Deque<Integer> deque;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
while (t-- > 0) {
String command = br.readLine();
int n = Integer.parseInt(br.readLine());
deque = new ArrayDeque<>();
StringTokenizer st = new StringTokenizer(br.readLine(), "[],");
for (int i = 0; i < n; i++) {
deque.add(Integer.parseInt(st.nextToken()));
}
System.out.println(AC(command));
}
}
public static String AC(String command) {
boolean reverse = false;
for(char c : command.toCharArray()) {
if (c == 'R') {
reverse = !reverse;
}else{
if (deque.size() == 0) {
return "error";
}
if (reverse) {
deque.removeLast();
} else {
deque.removeFirst();
}
}
}
StringBuilder sb = new StringBuilder();
sb.append("[");
while (!deque.isEmpty()) {
if (reverse) {
sb.append(deque.removeLast());
}else{
sb.append(deque.removeFirst());
}
if (deque.size() != 0) {
sb.append(",");
}
}
sb.append("]");
return sb.toString();
}
}
- 배열 직접 뒤집기 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class boj_5430 {
static int[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
while (t-- > 0) {
String command = br.readLine();
int n = Integer.parseInt(br.readLine());
arr = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine(), "[],");
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
System.out.println(AC(command));
}
}
public static String AC(String command) {
int start = 0;
int end = arr.length - 1;
for(char c : command.toCharArray()) {
if (c == 'R') {
// 뒤집기
reverse(start, end);
} else if (c == 'D') {
if (start >= end) {
return "error";
}
// 앞에 숫자 삭제
start++;
}
}
StringBuilder sb = new StringBuilder();
if (start != -1) {
sb.append("[");
for (int i = start; i <= end; i++) {
sb.append(arr[i]);
if (i <= end - 1) {
sb.append(",");
}
}
sb.append("]");
}
return sb.toString();
}
public static void reverse(int start, int end) {
int left = start, right = end;
while (left < right) {
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
right--;
left++;
}
}
}