알고리즘 풀이(JAVA) - 백준 알고리즘_5430(AC)
By on November 5, 2019
문제
문제 링크 : https://www.acmicpc.net/problem/5430
풀이
-
이 문제는 앞뒤로 입출력이 가능한 자료 구조인 덱(deque) 을 활용 하여 풀이하면 쉽게 풀 수 있다.
- R : 방향을 변경할때 배열을 돌리려고 하면 시간초과가 뜨기 때문에 변수(dir)를 선언 하여 방향을 저장 한다.
- D : 방향(dir) 에 따라서 firstPoll(), LastPoll() 을 활용하여 앞 뒤로 큐를 제거한다.
- 출력 : 모든 명령어를 수행한뒤 방향(dir)에 따라서 출력 결과를(showPrint()) 생성 한다.
소스
- AC(5430)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;
public class Baekjoon_5430 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//테스트 케이스 수(T)
int t = Integer.parseInt(reader.readLine());
for(int i = 0; i < t; i++) {
//수행할 함수 (P)
String[] p = reader.readLine().split("");
//배열의 갯수(N)
int n = Integer.parseInt(reader.readLine());
//배열
String[] x = reader.readLine().replace("[", "").replace("]", "").split(",");
String result = ac(p, n, x);
//결과 출력
System.out.println(result);
}
}
private static String ac(String[] p, int n, String[] x) {
Deque<Integer> dQ = makeDq(n, x);
String dir = "LEFT";
for (String order : p) {
if("R".equals(order)) {
if(dir.equals("LEFT")) {
dir = "RIGHT";
}else {
dir = "LEFT";
}
}else if("D".equals(order)) {
if(dQ.isEmpty()) {
return "error";
}else {
if(dir.equals("LEFT")) {
dQ.pollFirst();
}else {
dQ.pollLast();
}
}
}
}
StringBuilder sb = showPrint(dQ, dir);
return sb.toString();
}
private static StringBuilder showPrint(Deque<Integer> dQ, String dir) {
int dqLen = dQ.size();
StringBuilder sb = new StringBuilder("[");
for(int i = 0; i < dqLen; i++) {
if(dir.equals("LEFT")) {
sb.append(dQ.pollFirst());
}else {
sb.append(dQ.pollLast());
}
if(!dQ.isEmpty()) sb.append(",");
}
sb.append("]");
return sb;
}
private static Deque<Integer> makeDq(int n, String[] x){
Deque<Integer> dQ = new LinkedList<Integer>();
for(int i = 0; i < n; i++) {
dQ.add(Integer.parseInt(x[i]));
}
return dQ;
}
}