5430번 AC | 뭐라도 하겠지

5430번 AC

이왜틀?


img01

5430번 AC - 백준

과거의 나는 이걸 왜 틀렸을까?
틀린 문제를 파헤쳐보는 시간 이왜틀?

대부분 java로 틀렸던 문제들이라 웬만하면 java로 다시 해결하지 않을까 싶다.
아무튼 이 문제는 5년 전에 런타임 에러 1회 이후로 손을 안댄 것 같은데…

import java.io.*;
import java.util.*;

public class Main{
	public static void main(String[]z){
		try (BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
				BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));) {
			int tc=Integer.parseInt(br.readLine());
			while(tc-->0) {
				char[] p=br.readLine().toCharArray();
				int n=Integer.parseInt(br.readLine());
				boolean chk=true;
				String q=br.readLine();
				StringTokenizer st=new StringTokenizer(q.substring(1,q.length()-1),",");
				Deque<Integer> deq=new LinkedList<>();
				while(st.hasMoreTokens()) deq.add(Integer.parseInt(st.nextToken()));
				for(int i=0;i<p.length;i++) {
					char c=p[i];
					if(c=='R') {
						Stack<Integer> stk=new Stack<>();
						while(!deq.isEmpty()) stk.push(deq.pollFirst());
						while(!stk.isEmpty()) deq.add(stk.pop());
					}else {
						if(deq.isEmpty()) {
							chk=false;
							break;
						}else {
							deq.pollFirst();
						}
					}
				}
				if(chk) {
					StringBuilder sb=new StringBuilder();
					sb.append("[");
					while(true) {
						int i=deq.pollFirst();
						if(deq.isEmpty()) {
							sb.append(i+"]");
							break;
						}
						else sb.append(i+",");
					}
					bw.write(sb.toString()+"\n");
				}else {
					bw.write("error\n");
				}
				
			}
		} catch (Exception e) {e.printStackTrace();}
    }
}

디큐를 쓴 건 좋은데 마지막에 deq.pollFirst() 이전에 널체크를 했어야 하지 않을까?
모르겠고 머리아프니 새로 짜는게 낫겠다.
주석도 하나도 없어서 보기 싫다.

설계


입력이 고약한게 java 쓰기 싫은데… 그래도 java로 마무리 지어야겠다.
그냥 잘 받아서 잘 출력하면 그만인데 왜 틀렸을까

구현


1. 그지같은 입력 받기

무조건 깔끔하게 짜는게 목표라서 스캐너를 사용한다.
숫자 리스트는 앞 뒤 대괄호를 떼어주고 분해해서 deque에 넣는다.

Scanner sc = new Scanner(System.in);
		
int T = Integer.parseInt(sc.nextLine());

while(T-- > 0) {
	char[] p = sc.nextLine().toCharArray();
	sc.nextLine(); // n은 쓸데없음
	String x = sc.nextLine();
	x = x.substring(1, x.length() - 1); // 앞뒤 대괄호 제거
	
	// deque
	Deque<Integer> deque = new LinkedList<>();
	
	if(!x.isEmpty()) {
		StringTokenizer st = new StringTokenizer(x, ",");
		while(st.hasMoreTokens()) {
			deque.add(Integer.parseInt(st.nextToken()));
		}
	}
}
2. 명령 수행하여 출력

커서 역할을 할 불 값을 두고 R 명령어 시 변경한다.
D 명령어 시 예외처리해주며 poll 한다.

출력 시에는 앞 뒤에 다시 대괄호가 붙어야한다.

boolean front = true;
boolean error = false;

for(char oper : p) {
	if (oper == 'R') {
		front = !front;
	}
	
	// poll 할때만 error check
	if (oper == 'D') {
		if (deque.size() < 1) {
			error = true;
			break;
		}
		
		if (front) deque.pollFirst();
		else deque.pollLast();
	}
}

if (error) System.out.println("error");
else {
	StringBuilder sb = new StringBuilder();
	sb.append("[");
	
	// deque 출력
	while(!deque.isEmpty()) {
		sb.append((sb.length() == 1 ? "" : ","));
		if (front) sb.append(deque.pollFirst());
		else sb.append(deque.pollLast());
	}
	
	sb.append("]");
	System.out.println(sb.toString());
}

채점


img02

반성


입력도 그지같은데 출력도 그지같아서 대괄호 출력 부분에서 실수가 나서 한 번 틀렸다.
5년 전의 나야 내가 너를 구원했단다… 그곳에서는 편안하렴…

코드 확인


Link to GitHub

Updated: