문제 자체는 deque를 이용하면 너무 쉬웠는데 시간초과가 나서 어떻게 튜닝했는지 남겨보려고 포스팅한다!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Deque<Integer> dq = new LinkedList<>();
int N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
String cmd = st.nextToken();
if(st.hasMoreTokens()) {
dq.add(Integer.valueOf(st.nextToken()));
} else {
if(cmd.equals("front")) {
if(!dq.isEmpty()) System.out.println(dq.peekFirst());
else System.out.println("-1");
} else if(cmd.equals("back")) {
if(!dq.isEmpty()) System.out.println(dq.peekLast());
else System.out.println("-1");
} else if(cmd.equals("empty")) {
if(!dq.isEmpty()) System.out.println("0");
else System.out.println("1");
} else if (cmd.equals("size")) {
System.out.println(dq.size());
} else if (cmd.equals("pop")) {
if(!dq.isEmpty()) System.out.println(dq.pop());
else System.out.println("-1");
}
}
}
}
}
기존 소스는 아무 생각없이 명령어를 " " 기준 토큰으로 잘라서 분기문 돌린 후 sout을 찍어줬는데 시간 초과가 났다.
자바 개발할 때도 system.out.println 을 지양하고 로깅 라이브러리를 통해 로그를 남겼는데 코테할 땐 왜 아무 생각없이 쓰게 되는지 모르겠다 !!!
System.out.println()을 호출하게 되면 디스크 I/O 동기화 처리가 되기 때문에 전체적인 시스템의 성능이 저하 될 수 있고, System.out.println() 으로 디버그 처리한 부분을 일일이 주석처리, 해제하는 것은 개발 및 운영의 효율을 떨어트릴 수 있다.
그렇게 해서 프린트문을 싹 지우고 StringBuilder로 성능을 높이고,
StringTokenizer 객체를 굳이 만들 필요없이 입력받은 명령어 자체만으로 분기를 탈 수 있게 수정했더니 성공했다 !!!
수정후 코드!
package baekjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;
public class Main_18258 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
Deque<Integer> dq = new LinkedList<>();
int N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
String cmd = br.readLine();
if(cmd.equals("front")) {
if(!dq.isEmpty()) sb.append(dq.peekFirst()+"\n");
else sb.append("-1"+"\n");
} else if(cmd.equals("back")) {
if(!dq.isEmpty()) sb.append(dq.peekLast()+"\n");
else sb.append("-1"+"\n");
} else if(cmd.equals("empty")) {
if(!dq.isEmpty()) sb.append("0"+"\n");
else sb.append("1"+"\n");
} else if (cmd.equals("size")) {
sb.append(dq.size()+"\n");
} else if (cmd.equals("pop")) {
if(!dq.isEmpty()) sb.append(dq.pop()+"\n");
else sb.append("-1"+"\n");
} else {
dq.add(Integer.valueOf(cmd.split(" ")[1]));
}
}
System.out.println(sb);
}
}
또 하나 배워간다 ~ ~ ~