자료구조 & 알고리즘

[백준] 10828 스택 자바 문제 풀이(시간 초과 해결)

토발자 2022. 7. 24. 19:49
반응형


 

기초 자료구조인 Stack에 대해서 알고 있다면 어렵지는 않은 문제이다..

하지만 시간 초과가 떴고..

검색해보니 명령 N 이 최대 10,000이고 명령마다 println으로 출력 시 시간 초과가 발생할 수 있으므로 StringBufferr를 사용해주면 해결된다고 한다.

 

시간 초과

import java.io.*;
import java.util.*;
 
public class Main {
 
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    Stack<Integer> stack = new Stack<>();
    int num = sc.nextInt(); 
    
    for(int i = 0; i < num; i++) {
      String order = sc.next();
      
      switch (order) {
        case "push":
          stack.push(sc.nextInt());
          break;
        
        case "pop":
          if(stack.empty()) {
            System.out.println(-1);
          }
          else {
            System.out.println(stack.pop());
          }
          break;
          
        case "size":
          System.out.println(stack.size());
          break;
        
        case "empty":
          if(stack.empty()) {
            System.out.println(1);
          }
          else {
            System.out.println(0);
          }
          break;
          
        case "top":
          if(stack.empty()) {
            System.out.println(-1);
          } 
          else {
            System.out.println(stack.peek());
          }
          break;
      }
    }
  }
}

 

시간 초과 해결

import java.io.*;
import java.util.*;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        StringBuffer sb = new StringBuffer();
        Stack<Integer> stack = new Stack<>();
        int num = sc.nextInt(); 
    
        for(int i = 0; i < num; i++) {
            String order = sc.next();
      
            switch (order) {
                case "push":
                    stack.push(sc.nextInt());
                    break;
        
                case "pop":
                    if(stack.isEmpty()) {
                        sb.append(-1).append('\n');
                        // System.out.println(-1);
                    } else {
                        sb.append(stack.pop()).append('\n');
                        // System.out.println(stack.pop());
                    }
                    break;
          
                case "size":
                    sb.append(stack.size()).append('\n');
                    // System.out.println(stack.size());
                    break;

                case "empty":
                    if(stack.isEmpty()) {
                        sb.append(1).append('\n');
                        // System.out.println(1);
                    }
                    else {
                        sb.append(0).append('\n');
                        // System.out.println(0);
                    }
                    break;

                case "top":
                    if(stack.isEmpty()) {
                        sb.append(-1).append('\n');
                        // System.out.println(-1);
                    } 
                    else {
                        sb.append(stack.peek()).append('\n');
                        // System.out.println(stack.peek());
                    }
                    break;
            }
        }
        System.out.println(sb);
    }
}

주의할 점은 System.out.println() 처럼 출력 후 줄바꿈까지 해주기 위해서는 "\n"을 해야한다는 점이다.

반응형