코딩 테스트(Coding Test)/백준
[백준 18258] 큐 2
배씌
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();
}
}