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());
}
채점
반성
입력도 그지같은데 출력도 그지같아서 대괄호 출력 부분에서 실수가 나서 한 번 틀렸다.
5년 전의 나야 내가 너를 구원했단다… 그곳에서는 편안하렴…
코드 확인