반응형
📖 문제
📋 코드
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
반응형
'🧩PS > 🥈Nomal' 카테고리의 다른 글
[C++] 백준 18111번 - 마인크래프트 (0) | 2022.01.29 |
---|---|
[C++] 백준 14725번 - 개미굴 (2) | 2022.01.14 |
[JAVA] 백준 1021번 - 회전하는 큐 (1) | 2022.01.10 |
[JAVA] 백준 1966번 - 프린터 큐 (0) | 2022.01.04 |
[JAVA] 백준 18258번 - 큐 2 (0) | 2021.12.07 |