문제
테스트케이스
첫째줄 (4) : 테스트 케이스 개수
각 테스트 케이스
- R과 D로 이루어진 명령어
- 배열의 길이
- 배열(문자열로 주어진 배열)
알고리즘 분류
구현, 자료구조, 문자열, 파싱, 데크
자료구조 초기화
substring()을 통해 맨 앞에 ' [ ' , ' ] ' 을 잘라내고, ' , '을 구분자로 하여 split(",")으로 문자열을 쪼개주었다.
여기서 주의할 점은 만약 입력받은 배열 String의 길이가 2인 경우 "[ ]" 으로, 해당 연산을 할 경우 오류가 생긴다.
따라서 arrStr.length() > 2 라는 조건을 걸고 deque에 추가해준다.
//arrStr = 입력받은 배열 String
Deque<Integer> deque = new LinkedList<>();
if(arrStr.length() > 2){
String[] split = arrStr.substring(1,arrStr.length()-1).split(",");
for (int i=0;i< split.length;i++){
deque.addLast(Integer.parseInt(split[i]));
}
}
커맨드 실행
isReverse라는 flag를 통해 지금 배열이 커맨드 R로 인해 reverse 된 상태인지 체크한다.
만약 isReverse = true 라면, 데크에서 pollLast를 이용해서 뒤에서 값을 삭제하고,
isReverse = false 라면, 데크에서 pollFirst를 이용해서 앞에서 값을 삭제한다.
만약 데크가 비어있는 상태에서 커맨드 D 가 들어오면 isError flag를 true로 바꿔주고 커맨드 반복문을 종료한다.
출력
커맨드 연산을 모두 끝낸 상태에서 isReverse 여부를 확인하여 각 다르게 출력한다.
isReverse = true인 경우 pollLast를 이용하여 뒤에서부터 값을 빼며 출력하고,
isReverse = false인 경우 pollfirst를 이용하여 앞에서부터 값을 빼며 출력한다.
출력은 StringBuilder를 이용하는데, public class에 static 변수로 만들어놓은 StringBuilder에 append하고, 마지막에 한번에 출력한다.
주의사항
- 배열의 크기가 0인 상태에서의 커맨드 명령어 주의
- 배열의 크기가 0일때 문자열 파싱 주의
- 마지막에 출력할때, 배열의 크기가 0인 경우 주의
Code
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;
public class No5430 {
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
int N = Integer.parseInt(br.readLine());
for (int k = 0; k < N; k++) {
//케이스 시작
boolean isError = false;
//입력부
String cmd = br.readLine();//커맨드
int n = Integer.parseInt(br.readLine());//배열의 길이
String arrStr = br.readLine();//배열 문자열
char[] chars = cmd.toCharArray();
//배열 만들기
Deque<Integer> deque = new LinkedList<>();
if(arrStr.length() > 2){
String[] split = arrStr.substring(1,arrStr.length()-1).split(",");
for (int i=0;i< split.length;i++){
deque.addLast(Integer.parseInt(split[i]));
}
}
//커맨드 실행
boolean isReverse = false;
for(int i=0;i<chars.length;i++){
char ch = chars[i];
if(ch == 'R'){
if(isReverse){
isReverse = false;
}else{
isReverse = true;
}
}else if(ch == 'D'){
if(deque.isEmpty()){
isError = true;
break;
}else if(isReverse){
deque.pollLast();
}else{
deque.pollFirst();
}
}else{
isError = true;
break;
}
}
if (isError){
sb.append("error\n");
}else{
print(deque,isReverse);
}
//케이스 끝
}
System.out.println(sb);
}
static void print(Deque<Integer> deque, boolean isReverse){
if(deque.size() == 0){
sb.append("[]\n");
return;
}
sb.append("[");
int size = deque.size();
if(isReverse){
for(int i=0;i<size-1;i++){
sb.append(deque.pollLast()).append(",");
}
}else{
for(int i=0;i<size-1;i++){
sb.append(deque.pollFirst()).append(",");
}
}
sb.append(deque.poll()+"]\n");
}
}
반응형
'자료구조_알고리즘 > 코딩테스트' 카테고리의 다른 글
[백준/Java] 11000번 : 강의실 배정 / 그리디 알고리즘 (0) | 2023.06.26 |
---|---|
[JAVA/String] 알고리즘 문제풀이 시 유용한 String 문자열 다루기 (0) | 2023.06.09 |
[JAVA] 코딩테스트 문제 풀이시 유용한 [ 람다식, 스트림 ] 사용 예제 모음 (0) | 2023.06.07 |
[백준/JAVA] 11866번 : 요세푸스문제 0 / Queue 자료구조 (0) | 2023.06.05 |
[백준/JAVA] 2805번 : 나무 자르기 (이분탐색) (0) | 2023.06.03 |