내일은개발왕

백준 - 5430번 AC 본문

코딩문제풀기

백준 - 5430번 AC

NDN 2023. 1. 17. 11:53
import java.io.IOException;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Deque;
import java.util.Iterator;
import java.util.LinkedList;

public 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));
		StringBuilder str = new StringBuilder(); //이어붙여서 한번에 출력할거임
		
	    int data = Integer.parseInt(br.readLine());
	    Deque<String> dq = new LinkedList<>(); //연결리스트 사용해서 풀거임
	    
	    boolean R = false;
	    int check = 0;
	    
	    for(int i = 0; i < data; i++) { //테스트 케이스 개수 만큼 이를 반복할건데
	    	String order = br.readLine(); // 명령어 입력받고
	    	int count = Integer.parseInt(br.readLine()); //배열에 들어갈 수 개수 (반복할 횟수)
	    	String array = br.readLine(); //사용자가 입력한 배열[]
	    	
	    	array = array.substring(1, array.length() - 1); //양 끝 []없애주고
	    	
	    	if(array.length() == 0) { //없앴는데 0이라면 구할 수가 없으므로
	    		for(int a = 0; a < order.length(); a++) {
	    			if(order.charAt(a) == 'D') {
	    				check = -1;
	    			} else {
	    				R = false;
	    			}
	    		}
	    	} else {
	    		
	    	String[] li = array.split(",");
	    	
	    	for(int k = 0; k < li.length; k++) { //배열 길이만큼
	    		dq.add(li[k]);
	    	}
		    	for(int j = 0; j < order.length(); j++) { //명령어 길이만큼
		    		if(order.charAt(j) == 'R') { //명령어가 R이면 거꾸로 뒤집는거
		    			if(R == false) { //거꾸로
		    				R = true;
		    			} else if(R = true){ //한 번 더 뒤집기
		    				R = false;
		    			}
		    		} else { //D인경우, 
		    			if(R == true && dq.size() != 0) {
		    					dq.removeLast(); //뒤집었으니 뒤에서부터 제거
		    					
		    			} else if(R == false && dq.size() != 0) {
		    					dq.removeFirst(); //뒤집은거 다시 되돌렸으니 앞에서부터 제거
		    					
		    			} else if (dq.size() == 0) {
		    				check = -1;
		    			}
		    		}
		    	}
	    	}
	    	
	    	int c = dq.size(); //몇번 돌았는지 확인 할 변수 (거꾸로일때)
		    int c2 = dq.size(); //몇번 돌았는지 확인 할 변수 (거꾸로아닐때)
	    	
	    	if(R == true && check >= 0) { //거꾸로일때
	    		if(dq.size() == 0) {
	    			str.append("[]").append("\n");
	    		} else {
	    			str.append("[");
		    		Iterator<String> iterator = dq.descendingIterator(); //읽어들일꺼 생성해주고, 거꾸로 읽을꺼임
		    		while(iterator.hasNext() && c != -1) {
		    			if(c == 1) {
		    				str.append(iterator.next());
		    				--c;
		    			} else {
		    				str.append(iterator.next()+",");
		    				--c;
		    			}
		    		}
		    		str.append("]").append("\n");
	    		}
	    	} else if(R == false && check >= 0) {
	    		if(dq.size() == 0) {
	    			str.append("[]").append("\n");
	    		} else {
	    			str.append("[");
		    		Iterator<String> iterator = dq.iterator();
		    		
		    		while(iterator.hasNext() && c2 != -1) {
		    			if(c2 == 1) {
		    				str.append(iterator.next());
		    				--c2;
		    			} else {
		    				str.append(iterator.next()+",");
		    				--c2;
		    			}
		    		}
		    		str.append("]").append("\n");
	    		}
	    	} else if( check == -1) {
	    		str.append("error").append("\n");
	    	}
	    	
	    	dq.clear(); // 초기화해주기
	    	R = false;
	    	check = 0;
	    } // 맨 위 for문
	    bw.write(str.toString());
	    bw.close();
	}
}

첫 골드 문제를  풀었다!

주석을 전부 달아놨기 때문에 굳이 설명을 더 넣지는 않겠다.

주석 다는게 습관이 되어서.. 아마 앞으로 올릴 모든 코드에 주석이 달려있을 것이다.