코테 자바에 익숙해지려면 먼저 자료구조 사용이 원활해야한다.
그래서 스택을 사용하는 간단한 백준 문제 풀어보았다.
간단한 문제여서 무지성으로 풀었는데 c++에 익숙한 나에겐 상상도 해본적 없는 시간이 나왔다..! (근데 이 문제 시간제한 2초인데 왜 통과?)
아래 코드만 보고 원인을 찾아보세요!
private static void handleCommand(String commandLine){
int command = commandLine.charAt(0) - '0';
switch(command){
case 1:
stack.push(Integer.parseInt(commandLine.substring(2)));
break;
case 2:
if(stack.isEmpty()){
System.out.println("-1");
} else {
System.out.println(stack.pop());
}
break;
case 3:
System.out.println(stack.size());
break;
case 4:
if(stack.isEmpty()){
System.out.println(1);
} else {
System.out.println(0);
}
break;
case 5:
if(stack.isEmpty()){
System.out.println(-1);
} else {
System.out.println(stack.peek());
}
break;
default:
break;
}
}
.
.
.
.
.
.
원인은 무지성 System.out.println() 메서드 남발 때문이었다.
아래와 같이 StringBuilder로 모아놓고 마지막에 한 번에 출력하도록 변경하였다.
private static StringBuilder sb = new StringBuilder();
private static void handleCommand(String commandLine){
int command = commandLine.charAt(0) - '0';
switch(command){
case 1:
stack.push(Integer.parseInt(commandLine.substring(2)));
break;
case 2:
if(stack.isEmpty()){
sb.append(-1).append('\n');
} else {
sb.append(stack.pop()).append('\n');
}
break;
case 3:
sb.append(stack.size()).append('\n');
break;
case 4:
if(stack.isEmpty()){
sb.append(1).append('\n');
} else {
sb.append(0).append('\n');
}
break;
case 5:
if(stack.isEmpty()){
sb.append(-1).append('\n');
} else {
sb.append(stack.peek()).append('\n');
}
break;
default:
break;
}
느리다는건 알고 있었지만 이 정도였다고?
놀랍도록 시간이 많이 개선되었다!
+가독성 있게 좀 더 개선
private static void handleCommand(String commandLine){
int command = commandLine.charAt(0) - '0';
switch(command){
case 1:
stack.push(Integer.parseInt(commandLine.substring(2))); return;
case 2:
sb.append(stack.isEmpty()? -1 : stack.pop()).append('\n'); return;
case 3:
sb.append(stack.size()).append('\n'); return;
case 4:
sb.append(stack.isEmpty() ? 1 : 0).append('\n'); return;
case 5:
sb.append(stack.isEmpty() ? -1 : stack.peek()).append('\n'); return;
}
}