반응형

 

📖 문제

 

📋 코드

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		StringBuffer sb = new StringBuffer();
		int T = sc.nextInt(); // 테스트 케이스

		for (int i = 0; i < T; i++) {
			Deque<Integer> dq = new LinkedList<>(); // 배열을 담을 큐
			boolean direction = true; // 순방향||역방향
			boolean error = false;

			String p = sc.next(); // 수행할 함수
			int n = sc.nextInt(); // 배열 원소 수
			String tmp = sc.next();
			tmp = tmp.substring(1, tmp.length() - 1);
			String arr[] = tmp.split(","); // 배열 원소

			if (tmp != "") {
				for (int j = 0; j < arr.length; j++) { // 배열 큐에 담기
					dq.add(Integer.parseInt(arr[j]));
				}
			}

			for (int j = 0; j < p.length(); j++) {
				switch (p.charAt(j)) {
					case 'R':
						direction = !direction;
						break;

					case 'D':
						if (!dq.isEmpty()) {
							if (direction) { // 순방향
								dq.pollFirst();
							} else { // 역방향
								dq.pollLast();
							}
							break;
						} else {
							error = true;
							break;
						}
					default:
						break;
				}

				// 비어있는 덱 원소 삭제 시도시
				if (error)
					break;
			}

			if (error) { // 비어있는 덱 원소 삭제 시도시
				sb.append("error").append("\n");
			} else {
				sb.append("[");
				if (direction) {
					while (!dq.isEmpty()) {
						sb.append(dq.pollFirst());
						if (dq.isEmpty())
							break;
						sb.append(",");
					}

				} else {
					while (!dq.isEmpty()) {
						sb.append(dq.pollLast());
						if (dq.isEmpty())
							break;
						sb.append(",");
					}
				}
				sb.append("]").append("\n");
			}
		}
		System.out.println(sb);
	}
}

👨🏻‍💻 결과

 

 

📕 풀이 방법

Deque<Integer> dq = new LinkedList<>(); // 배열을 담을 큐
boolean direction = true; // 순방향||역방향
boolean error = false;

dq : 맨 앞의 원소뿐만 아니라 맨 뒤의 원소도 제거하기 위해 Deque를 사용

direction : R(뒤집기)로 현재 순방향인지 역방향인지 알려주는 역할
예를 들어 direction이 false인 경우에 D(버리기)를 실행하면 맨 뒤의 원소가 삭제됩니다.

error : 비어있는 덱에서 D(버리기) 실행 시 "error"가 발생했음을 알리는 역할

 

String p = sc.next(); // 수행할 함수
int n = sc.nextInt(); // 배열 원소 수
String tmp = sc.next();
tmp = tmp.substring(1, tmp.length() - 1);
String arr[] = tmp.split(","); // 배열 원소

if (tmp != "") {
	for (int j = 0; j < arr.length; j++) { // 배열 큐에 담기
		dq.add(Integer.parseInt(arr[j]));
	}
}

입력들을 받고 배열 부분을 파싱 하여 덱에 저장하는 코드입니다.

 

for (int j = 0; j < p.length(); j++) {
	switch (p.charAt(j)) {
		case 'R':
			direction = !direction;
		break;

		case 'D':
			if (!dq.isEmpty()) {
				if (direction) { // 순방향
					dq.pollFirst();
				} else { // 역방향
					dq.pollLast();
				}
				break;
			} else {
				error = true;
				break;
			}
		default:
			break;
	}

	// 비어있는 덱 원소 삭제 시도시
	if (error)
		break;
}

함수가 'R'인 경우에는 direction 바꿔주기

함수가 'D'인 경우에는 방향에 따라 맨 앞의 원소나 맨 뒤의 원소 삭제 (삭제할 원소가 없을 때는 error 발생)

 

if (error) { // 비어있는 덱 원소 삭제 시도시
	sb.append("error").append("\n");
} else {
	sb.append("[");
	if (direction) {
		while (!dq.isEmpty()) {
			sb.append(dq.pollFirst());
			if (dq.isEmpty())
				break;
			sb.append(",");
		}

	} else {
		while (!dq.isEmpty()) {
			sb.append(dq.pollLast());
			if (dq.isEmpty())
				break;
			sb.append(",");
		}
	}
	sb.append("]").append("\n");
}

함수 수행 후 덱 원소들 출력!

수행할 함수 개수, 배열 개수 모두 최대 10만이므로 System.out으로 출력 시 시간 초과가 발생할 수 있습니다. 따라서 StringBuffer를 사용해서 출력을 저장한 뒤 한 번에 출력하도록 합니다. 

StringBuffer sb = new StringBuffer();

 

 

 

🔗 링크

https://www.acmicpc.net/problem/5430

 

5430번: AC

각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다.

www.acmicpc.net

 

반응형

+ Recent posts