문제
풀이
RDD 4 [1,2,3,4]
R(배열 뒤집기) 또는 D(앞쪽 숫자 제거)로 구성된 작업을 [1,2,3,4] 배열에 순차적으로 적용한 결과를 얻는 문제다.
중요한 부분이 2가지 있다.
- 입력데이터를 적절한 데이터로 변환
- 작업 수행을 얼마나 효율적으로 진행할 것인가?
1. 입력데이터를 적절한 데이터로 변환
R 또는 D로 구성된 작업 리스트는 toCharArray로 문자 배열로 변환했다.
[1,2,3,4] 형식을 배열로 변환해야 한다.
앞뒤 '[', ']'는 고정이므로 substring으로 앞뒤 한 칸씩 뺀 문자열을 얻고, split으로 콤마(,)를 기준으로 나눠주면 온전한 숫자 부분만 얻을 수 있다.
2. 작업 수행을 얼마나 효율적으로 진행할 것인가?
작업이 배열을 뒤집거나 가장 앞쪽 원소를 제거하는 것이다.
배열의 앞 또는 뒤 원소를 제거할 수 있다.
R 작업이 있을 때 배열을 실제로 뒤집지 않고, 제거할 방향을 알고 있는 변수를 이용해서 원소 제거 위치를 알 수 있게 한다.
배열 앞 또는 뒤의 원소 제거를 할 수 있어야 하기 때문에 LinkedList로 구현된 Deque를 이용한다.
deque.pollFirst() - 앞쪽에서 원소 제거
deque.pollLat() - 뒤쪽에서 원소 제거
LinkedList로 구현하였기 때문에 원소 제거에 시간이 오래 걸리지 않는다.
- 빈 배열의 경우 error와 [] 결과가 나올 수 있기 때문에 처리하기 까탈스럽다.
- 다른 사람의 코드를 보니까, deque를 이용해서 원소를 제거하지 않고 일반 array에서 좌우 인덱스 값을 계산해서 출력 인덱스 범위로 출력하는 방법도 있다.
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
/**
* [백준] 5430번 AC
*/
public class N5430 {
public static final int LEFT = 0;
public static final int RIGHT = 1;
public static final int RESULT_ERROR = 2;
public static void main(String args[]) throws IOException {
// 입력 값 셋팅
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuffer sb = new StringBuffer();
int T = Integer.parseInt(st.nextToken());
while (T-- > 0) {
char[] jobs = br.readLine().toCharArray();
int N = Integer.parseInt(br.readLine());
String x = br.readLine();
String[] nn = x.substring(1, x.length() - 1).split("\\,");
Deque<Integer> numbersList = new LinkedList<>();
for (int i = 0; i < N; i++) {
numbersList.add(Integer.parseInt(nn[i]));
}
int checkResult = doJobs(jobs, numbersList);
if (checkResult == RESULT_ERROR) {
sb.append("error").append("\n");
continue;
}
sb.append('[');
if(!numbersList.isEmpty()){
if (checkResult == LEFT) {
sb.append(numbersList.pollFirst());
while (!numbersList.isEmpty()) {
sb.append(',').append(numbersList.pollFirst());
}
} else if (checkResult == RIGHT) {
sb.append(numbersList.pollLast());
while (!numbersList.isEmpty()) {
sb.append(',').append(numbersList.pollLast());
}
}
}
sb.append(']').append("\n");
}
System.out.print(sb.toString());
}
private static int doJobs(char[] jobs, Deque<Integer> numbersList) {
int deleteDirection = LEFT;
for (int i = 0; i < jobs.length; i++) {
if (jobs[i] == 'R') {
deleteDirection = (deleteDirection == LEFT) ? RIGHT : LEFT;
} else if (jobs[i] == 'D') {
if (numbersList.isEmpty()) {
return RESULT_ERROR;
}
if (deleteDirection == LEFT) {
numbersList.pollFirst();
} else {
numbersList.pollLast();
}
}
}
return deleteDirection;
}
}
'CS > 알고리즘' 카테고리의 다른 글
[프로그래머스] 위클리 챌린지 7주차 - 입실 퇴실 (0) | 2021.09.15 |
---|---|
[프로그래머스] 위클리 챌린지 6주차 - 복서 정렬하기 (0) | 2021.09.14 |
[프로그래머스] 카카오프렌즈 컬리링북 (0) | 2021.08.11 |
[프로그래머스] 위클리 챌린지 1주차 - 상호 평가 (0) | 2021.08.09 |
[프로그래머스] 위클리 챌린지 2주차 - 상호 평가 (0) | 2021.08.09 |