자바 코테 출력 시간 비교

준하·2024년 9월 23일
0
post-thumbnail

BOJ 28278 - 스택 2

코테 자바에 익숙해지려면 먼저 자료구조 사용이 원활해야한다.
그래서 스택을 사용하는 간단한 백준 문제 풀어보았다.


간단한 문제여서 무지성으로 풀었는데 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;
        }
    }
profile
A Sound Code in a Sound Body💪

0개의 댓글