728x90

문제

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

+ Recent posts