sm 기술 블로그

163. 5430(AC) - 자바 본문

문제/백준_자바

163. 5430(AC) - 자바

sm_hope 2022. 7. 28. 09:21
import java.util.*;
import java.io.*;

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 x = br.readLine();
			x = x.replace("[", "");
			x = x.replace("]", "");
			x = x.replace(",", " ");
			String[] tmp = x.split(" ");
			// reverse함수를 위해 deque대신 likedList 사용함
			LinkedList<String> queue = new LinkedList<>();
			int R_cnt = 0;
			boolean error = false;

			for (int j = 0; j < n; j++) {
				queue.add(tmp[j]);
			}

			for (String val : p) {
				if (val.equals("R")) {
					R_cnt++;
					continue;
				}

				if (val.equals("D") && queue.size() == 0) {
					error = true;
					break;
				} else {
					if (R_cnt % 2 == 0)
						queue.pollFirst();
					else
						queue.pollLast();
				}
			}

			if (error) {
				sb.append("error").append("\n");
			} else {
				if (R_cnt % 2 == 1) {
					Collections.reverse(queue);
				}

				sb.append("[").append(String.join(",", queue)).append("]").append("\n");
			}

		}

		System.out.print(sb);

	}
}

문제요약

R은 뒤집기 D는 앞의 자리수 제거 를 진행해라. 만약 D를 했을 때 큐 내에 값이 없다면 "error"를 출력해라.

설명

문제는 크게 어렵지 않으나 트릭이 숨어 있다.

 

1. 정직하게  R일때 바로바로 뒤집으면 시간 초과가 발생한다.

2. x가 비어있을 때 []를 출력해야한다.

 

이 두가지를 지키면 크게 어렵지 않다.

 

			String[] p = br.readLine().split("");
			int n = Integer.parseInt(br.readLine());
			String x = br.readLine();
			x = x.replace("[", "");
			x = x.replace("]", "");
			x = x.replace(",", " ");
			String[] tmp = x.split(" ");
			// reverse함수를 위해 deque대신 likedList 사용함
			LinkedList<String> queue = new LinkedList<>();
			int R_cnt = 0;
			boolean error = false;

			for (int j = 0; j < n; j++) {
				queue.add(tmp[j]);
			}

 

입력값들을 처리해 주었다. 

링크드리스트를 사용하는 이유는 reverse함수를 사용하기 위해서 이다.

x는 [1,3,4]와 같은 형식으로 들어오기때문에 사전 작업이 필요하다.

				if (val.equals("R")) {
					R_cnt++;
					continue;
				}

R인 경우 바로바로 뒤집지 않고 먼저 카운터를 증가시킨다.

나중에 한번에 처리할 것이다.

				if (val.equals("D") && queue.size() == 0) {
					error = true;
					break;
				}

D이고 큐 내에 값이 없다면 에러대상이다.

				else {
					if (R_cnt % 2 == 0)
						queue.pollFirst();
					else
						queue.pollLast();
				}

에러 대상이 아니라면 D를 수행할 수 있다는것 따라서  D를 수행하는데 수행하기 앞서 먼저 조건문으로 처리를 해보자.

만약, R_cnt 를 2로 나눈 나머지가 0이라면 뒤집지 않았다는 것이므로 맨 처음 값을 바로 빼준다.

2로 나누어 지지 않으면 뒤집어야 한다는 소리이므로 뒤집어 지면 맨뒤가 처음으로 빠지므로 맨 뒤에 있는 값을 빼준다.

 

			if (error) {
				sb.append("error").append("\n");
			} else {
				if (R_cnt % 2 == 1) {
					Collections.reverse(queue);
				}

				sb.append("[").append(String.join(",", queue)).append("]").append("\n");
			}

우리는 값이 없다면, []를 출력해야 하기 때문에 에러를 먼저 조건문으로 처리해준다.

에러가 아니라면 값을 처리해주는데,

여기서 뒤집기를 진행한다.

'문제 > 백준_자바' 카테고리의 다른 글

165. 1992(쿼드트리) - 자바  (0) 2022.07.30
164. 2630 (색종이 만들기) - 자바  (0) 2022.07.30
162. 1021(회전하는 큐) - 자바  (0) 2022.07.27
161. 10866(덱) - 자바  (0) 2022.07.27
160. 1966(프린트 큐) - 자바  (0) 2022.07.26
Comments