배씌 2024. 11. 6. 14:36

https://www.acmicpc.net/problem/18258


1. 아이디어

큐의 기능인 위 6가지 기능을 구현하면 되는 간단한 문제이다. 그러나 특이하게 front 와 back을 구분해서 출력을 해야 하기에 Queue보다는 Java의 Deque를 이용하여 back도 간편하게 출력하고자 하였다. 

// 저장할 큐
Deque<Integer> q = new LinkedList<>();

 

커맨드를 입력받고, 그에 맞는 기능을 실행시키기 위해 보자마자 switch-case 구문이 생각났다. 그리하여 아래와 같이 띄워쓰기를 구분하기 위해 StringTokenizer로 문장을 받고,  "push" 일때만 num을 추가하고, 나머지는 각 기능을 실행 및 출력하는 형식으로 코드를 작성했다.

StringTokenizer st = new StringTokenizer(br.readLine());
String command = st.nextToken();

switch (command) {
	// #1. push
    case "push":
    	int num = Integer.parseInt(st.nextToken());
        q.add(num);
        break;
    	
    // #2. pop
    case "pop":
        System.out.println(q.isEmpty() ? "-1" : q.poll());
        break;

    // #3. size
    case "size":
        System.out.println(q.size());
        break;
        
	... (중략)

 

그러나 위 방법대로 제출하면, 시간초과가 발생하여 실행 시간을 최대한 줄일 수 있는 방법으로 리팩토링 하기로 하였다. 우선 시간이 늦는

- System.out.print 대신 StringBuilder와 BufferedWriter를 사용하여 반복이 끝난 후 한번에 출력하는 방법

- StringTokenizer를 사용하여 모든 문장에 대해 토큰화를 하지 않고 "push" 일 때만 뒤 숫자를 읽어 추가하는 방법

 

위 두 방식을 코드에 적용 시키니 시간초과가 발생하지 않고, 정상적으로 제출이 완료되었다.

 

2. 코드

package IntStudy;

import java.io.*;
import java.util.Deque;
import java.util.LinkedList;
import java.util.StringTokenizer;

// [백준_18258] 큐 2
public class B_18258 {
    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 sb = new StringBuilder();

        // 저장할 큐
        Deque<Integer> q = new LinkedList<>();

        int N = Integer.parseInt(br.readLine());
        while (N-- > 0) { // N번 만큼 반복
            // 커맨드 입력
            String command = br.readLine();

            // #1. push (기존의 StringTokenizer 방법에서 변경)
            if(command.contains("push")){
                int num = Integer.parseInt(command.split(" ")[1]);
                q.add(num);
            }
            else {
                switch (command) {
                    // #2. pop
                    case "pop":
                        sb.append(q.isEmpty() ? "-1" : q.poll()).append("\n");
                        break;

                    // #3. size
                    case "size":
                        sb.append(q.size()).append("\n");
                        break;

                    // #4. empty
                    case "empty":
                        sb.append(q.isEmpty() ? "1\n" : "0\n");
                        break;

                    // #5. front
                    case "front":
                        sb.append(q.isEmpty() ? "-1" : q.peek()).append("\n");
                        break;

                    // #6. back
                    case "back":
                        sb.append(q.isEmpty() ? "-1" : q.getLast()).append("\n");
                        break;
                }
            }
        }
        bw.write(sb.toString());
        bw.flush();

        bw.close();
        br.close();
    }
}