문제
R(뒤집기)과 D(버리기) 함수가 있는 AC 언어를 이용하여
주어진 명령어대로 함수를 실행했을 때 결과를 반환해야 하며
배열에 있는 수가 없을 때는 D 함수를 실행하면 에러를 발생시켜야 한다.
접근 방식
여태까지 문제를 풀던 방식과는 다르게 입력이 배열로 들어와서
이걸 스캐너나 BufferedReader를 사용해서 어떻게 받아야 할지 몰라
시작부터 애를 먹었던 문제다...
String input = "[1,2,3,4]"; // = br.readLine()
String[] arr = input.substring(1, arrInput.length() - 1).split(",");
이런 식으로 서브스트링을 이용해 시작과 끝의 괄호를 없앤 후에
스플릿 함수를 이용하여 콤마 단위로 배열에 담아주었다.
이 문제는 주의해야 할 부분이 하나 더 있는데 바로 시간 복잡도다.
주어진 입력이 리버스 함수를 실행할 때 실제로 순서를 바꾸려하면
입력의 크기가 큰 경우에는 시간 초과가 발생한다.
문제 자체의 풀이는 풀고 나니 쉽게 느껴지지만
막상 풀 당시에는 쉽지 않았다.
우선 시간 초과를 해결하기 위해서는
리버스 함수가 실행될 때 배열을 실제로 뒤집는 것이 아니라
뒤집힌 척하는 것이 중요하다.
뭔 소린가 할 수도 있지만 배열이 현재 뒤집혔는지 안 뒤집혔는지
상태를 부여하고 상태에 맞게 요소를 다루면 된다.
boolean reversed = false;
case "R": {
reversed = !reversed;
break;
}
위와 같이 초기 상태는 뒤집히지 않은 상태니 false로 초기화한 후에
리버스 함수가 실행될 때마다 이 값을 바꿔주면 된다.
한 가지 더 조심해야 할 게 있는데
Arrays.toString() 메서드를 사용해서 배열을 출력하면 [1, 2, 3, 4] 형태로 출력되어
문제에서 요구하는 응답인 [1,2,3,4] 형태가 아니기 때문에
직접 띄어쓰기가 없는 응답을 만들어줘야 한다.
(코드에 문제가 없는 거 같은데 대체 왜 틀리나 했다...)
풀이
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int t = Integer.parseInt(br.readLine());
for (int i = 0; i < t; i++) {
String[] p = br.readLine().split("");
int n = Integer.parseInt(br.readLine());
String arrInput = br.readLine();
String[] arr = arrInput.substring(1, arrInput.length() - 1).split(",");
ArrayDeque<Integer> deque = new ArrayDeque<>();
boolean reversed = false;
for (int j = 0; j < arr.length; j++) {
if (!arr[j].isEmpty()) {
deque.offer(Integer.parseInt(arr[j]));
}
}
out:
for (int j = 0; j < p.length; j++) {
switch (p[j]) {
case "R": {
reversed = !reversed;
break;
}
case "D": {
if (deque.isEmpty()) {
sb.append("error").append("\n");
break out;
}
if (reversed) {
deque.pollLast();
} else {
deque.poll();
}
break;
}
}
if (j == p.length - 1) {
sb.append("[");
while (!deque.isEmpty()) {
sb.append(reversed ? deque.pollLast() : deque.poll());
if (!deque.isEmpty()) {
sb.append(",");
}
}
sb.append("]").append("\n");
}
}
}
System.out.println(sb);
}
}
'Java > Algorithms' 카테고리의 다른 글
[백준] 3986번 : 좋은 단어 (0) | 2023.10.07 |
---|---|
[백준] 4949번 : 균형잡힌 세상 (0) | 2023.10.05 |
[백준] 1021번 : 회전하는 큐 (0) | 2023.10.04 |
[백준] 10866번 : 덱 (2) | 2023.10.03 |
[백준] 2164번 : 카드2 (0) | 2023.10.03 |