-
[백준/JAVA] 5430번 AC - Deque, 문자열 파싱ETC/Algorithm 2023. 6. 9. 09:28
문제
풀이
자바의 Deque 컬렉션을 사용하여 문제를 풀이하였다.
문제의 요점인 방향성을 제어하기 위해 way라는 변수를 사용하였고,
입력값이 [ ] ,(반점) 3개의 특수문자로 감싸져 있기 때문에 StringTokenizer로 문자열을 파싱해줬다.코드
제출 코드
import java.io.*; import java.util.*; class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 케이스 개수 T 입력 int T = Integer.parseInt(br.readLine()); for (int t = 0; t < T; t++) { // 함수 배열 cmd 입력 String cmdLine = br.readLine(); int cLen = cmdLine.length(); char[] cmd = new char[cLen]; for (int i = 0; i < cLen; i++) { cmd[i] = cmdLine.charAt(i); } // 배열에 들어있는 수 n 입력 int n = Integer.parseInt(br.readLine()); // 배열을 입력 받을 Deque 타입 선언 Deque<Integer> dq = new ArrayDeque<>(); // StringTokenizer로 문자열 분리 "[", "]", "," 3개로 분리한다. StringTokenizer st = new StringTokenizer(br.readLine(), "[],"); // 정수형태로 Deque에 입력 for (int i = 0; i < n; i++) { dq.add(Integer.parseInt(st.nextToken())); } // 뒤집기 상태를 관리할 way, true = 앞->뒤 boolean way = true; // 에러 상태를 관리할 error, dq가 비어있는데 D를 한번이라도 한 순간 true로 변경 boolean error = false; for (int i = 0; i < cLen; i++) { if (cmd[i] == 'R') { way = !way; } else if (cmd[i] == 'D') { if (!dq.isEmpty()) { if (way) { Integer polled = dq.pollFirst(); } else { Integer polled = dq.pollLast(); } } else { error = true; } } } // 출력 구현 if (!error) { // dq에 상태에 따라 뒤집어야하므로, dq를 List로 변환 ArrayList<Integer> arr = new ArrayList<>(dq); // way의 값에 따라 출력 if (way) { bw.write(arr.toString().replace(" ", "")); } else { Collections.reverse(arr); bw.write(arr.toString().replace(" ", "")); } } else { bw.write("error"); } bw.write("\n"); bw.flush(); } } }
공부한 내용
StringTokenizer
// StringTokenizer로 문자열 분리 "[", "]", "," 3개로 분리한다. StringTokenizer st = new StringTokenizer(br.readLine(), "[],");
StringTokenizer의 delim에 문자열을 하나씩 입력해주면 알아서 파싱되서 순서대로 가져올 수 있다.
덱 (Deque)
자바의 컬렉션 중 하나인 덱은
pollFirst(), pollLast()를 통해
poll의 방향을 앞 뒤로 할 수 있다.