목차
1. 문제 설명
2. 원리 설명
3. 코드 분석
1. 문제 설명
https://www.acmicpc.net/problem/5430
2. 원리 설명
해당 문제는 deque라는 양방향에서 add, poll이 가능한 자료구조를 이용하여 문제를 풀었다.
아직 deque가 낯선 분들은 여기로 가서 봐주세요
https://velog.io/@sdk1926/deque%EB%8A%94-%EC%99%9C-%EC%93%B8%EA%B9%8C
toggle(boolean) 값을 두었다. 그래서 R이라는 명령어가 들어오면 true, false를 토글했다. true는 앞을 가리키고, false는 뒤를 가리킨다. D라는 명령어가 들어오면 toggle 방향에 따라 머리 혹은 꼬리에서 값을 poll했다.
한 번 틀린 이유: deque가 비었을 때, D 명령어가 들어오면 error를 출력해야하고, 명령어가 다 끝난 뒤에 배열이 비어있으면 그대로 [ ]를 출력해야 했다. 이 부분 예외처리를 안해줘서 틀렸다.
3. 코드 분석
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Array;
import java.util.*;
// 5430번 AC
public class Main {
// T: Testcase, p: 명령어의 개수, n: 배열안의 수의 개수
static int T,n;
// orders: 명령어가 일렬로 들어가있는 문자열
static String orders;
// arr: 숫자가 들어있는 배열
static String [] arr ;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(br.readLine());
for (int t = 0; t < T; t++) {
// 1) 값 입력 받기
orders = br.readLine();
n = Integer.parseInt(br.readLine());
String temp = br.readLine();
if(temp.equals("[]")){
arr = new String[0];
}else{
arr = temp.substring(1,temp.length()-1).split(",");
}
int isError = 0;
// 2) Deque에 넣기
ArrayDeque<String> aq1 = new ArrayDeque<>();
aq1.addAll(Arrays.asList(arr));
// 3) Reverse toggle을 두고 R이 들어올 때마다 위치 바꾸기
// true -> front, false -> rear
boolean toggle = true;
for (int i = 0; i < orders.length(); i++) {
if(orders.charAt(i) == 'R'){
toggle = !toggle;
}
if(orders.charAt(i) == 'D'){
if(aq1.isEmpty()){
isError = 1;
break;
}
if(toggle){
aq1.pollFirst();
}
else{
aq1.pollLast();
}
}
}
// 출력 부분
if(aq1.isEmpty()){
if(isError == 0){
System.out.println("[]");
}else {
System.out.println("error");
}
} else if (!toggle) {
StringBuilder sb = new StringBuilder().append("[");
int Qsize = aq1.size();
for (int i = 0; i < Qsize; i++) {
sb.append(aq1.pollLast());
if(i != Qsize-1){
sb.append(",");
}
}
sb.append("]");
System.out.println(sb);
} else {
StringBuilder sb = new StringBuilder().append("[");
int Qsize = aq1.size();
for (int i = 0; i < Qsize; i++) {
sb.append(aq1.poll());
if(i != Qsize-1){
sb.append(",");
}
}
sb.append("]");
System.out.println(sb);
}
}
}
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
💔 백준 14500 테트로미노 (0) | 2024.04.09 |
---|---|
💔 백준 2503 숫자야구 JAVA (0) | 2024.04.07 |
💔 14889. 스타트와 링크 (0) | 2024.03.08 |
💜 2589 보물섬 (0) | 2024.03.06 |
💜 2667번 단지 번호 붙이기 JAVA (0) | 2024.03.02 |