-
[BOJ - JAVA] 5430 - AC (덱) 본문
# 주소
https://www.acmicpc.net/problem/5430
# 문제
# 문제 해설 및 코드 리뷰
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
while (n-- > 0) {
String str = scan.next();
int num = scan.nextInt();
String x = scan.next();
String x_sub[] = x.substring(1, x.length() - 1).split(",");
Deque<Integer> queue = new LinkedList<>();
for(int i = 0; i < x_sub.length; i++) {
if(!x_sub[i].equals(""))
queue.offer(Integer.valueOf(x_sub[i]));
}
System.out.println(ac(queue, str));
}
}
public static String ac(Deque<Integer> queue, String str){
boolean reverse = false;
for (char s : str.toCharArray()) {
if (s == 'R') {
reverse = !reverse;
}
else{
if(queue.size() == 0){
return "error";
}
if (reverse) {
queue.removeLast();
}
else
queue.removeFirst();
}
}
StringBuilder sb = new StringBuilder("[");
while(!queue.isEmpty()){
if(reverse)
sb.append(queue.removeLast());
else
sb.append(queue.removeFirst());
if(queue.size() != 0)
sb.append(',');
}
sb.append(']');
return sb.toString();
}
}
이제 척하면 척이어야 합니다.
함수를 새로 만들어서 R이면 함수를 뒤집고, D이면 함수의 첫 번째 배열을 제거하는 문제입니다.
이 문제를 풀때에는 R이 나온다고 해서 함수를 진짜로 뒤집으면 안되고, R이 한 번 나왔을 때는 마지막 원소를 제거하고 짝수번 나왔을 때에는 첫 번째 원소를 제거한다는 이 틀을 기억하셔야합니다.
따라서 R이 나올때마다 reverse라는 boolean타입의 변수를 만들고 계속해서 !reverse를 reverse에 담으면 됩니다.
자 이게 지금까지 핵심 포인트였고 처음부터 문제를 되짚어봅시다.
일단 n개의 테스트케이스가 주어지므로 while(n--> 0){으로 입력을 진행해나갑니다.
str와 num을 입력받고 x를 문자열로 입력받습니다.
여기서 str은 함수(RDD라던지 DD라던지)이고 num은 원소 개수, x는 [1,2,3,4]같은 배열을 문자열로 받습니다.
그리고 이것을 저도 이번에 배웠는데, substring이라고 하면 문자열을 자를 수 있습니다.(사실 예전에 배웠지만 잊고있었음)
근데, substring은 인덱스를 지정하여 문자열을 자를 수 있습니다.
따라서 x.substring(1, x,length()-1)이란 것은 x를 1의 위치부터 x.length()-1의 위치까지 slice하겠다는 뜻입니다.
이 잘라진 것을 split(","이라고 입력하면 ,으로 구분해서 x_sub[]에 담겠다는 뜻이 됩니다.
그리고 담긴 x_sub는 배열 형태가 되는데요.
여기서 중요한게, 이 x_sub가 공백이면 안되잖아요.
그래서 x_sub.equals("")가 아닐 때 queue에 담아야 합니다.
면접에서도 가끔 나오는 유형인데, equals와 ==의 차이. 무엇인지 아시겠지요?
equals는 문자열이 같은 것이 있는지 물어보는 거랍니다.
자 그리고 이 queue에 x_sub의 원소를 그냥 담으면 안되고 Integer.valueOf로 형변환을 해서 넣어야 합니다.
이 x_sub[i]의 원소는 현재 String 상태이기 때문에 정수형태로 바꾸어서 생각을 해줍시다.
그리고 이것을 ac라는 메서드에 queue와 str을 넣고 실행합니다.
이후 str각 문자를 toCharArray라고 입력하면 문자열의 배열로 만들어줍니다.
이를 통해 s == R일땐 reverse를 반대로 바꾸는 시도를 합니다.
그리고 D가 들어왔을 땐 현재의 reverse를 참일때와 거짓일때를 나누어, reverse가 참일 땐 배열을 뒤집을 때이므로 제일 뒤의 원소를 제거하고 거짓일 때는 제일 앞에 있는 원소를 제거합니다.
이래서 덱이 편합니다.
덱은 양방향의 데이터 삽입, 삭제, 불러오기 등에 유용합니다.
꼭 알고 계시면 좋겠습니다.
음 이후 StringBuilder에 queue의 원소를 차례대로 넣는데, reverse가 참이면 뒤에서부터, false이면 앞의 원소부터 sb에 담고 sb를 toString, 문자열로 변환한 뒤 출력하시면 정답이 됩니다.
감사합니다.
'백준 문제 풀이' 카테고리의 다른 글
[BOJ - JAVA] 1967 - 트리의 지름 (DFS) (0) | 2022.01.01 |
---|---|
[BOJ - JAVA] 2589 - 보물섬 (BFS) (0) | 2021.12.31 |
[BOJ - JAVA] 12865 - 평범한 배낭 (DP) (0) | 2021.12.27 |
[BOJ - JAVA] 2042 - 구간 합 구하기 (세그먼트 트리) (0) | 2021.12.24 |
[BOJ - JAVA] 2573 - 빙산 (DFS) (0) | 2021.12.22 |