코딩테스트/BOJ

[BOJ] 10828 스택 - JAVA

5월._. 2022. 2. 5.
728x90


1. 풀이

1) java.util.Stack 사용

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;

public class BOJ_10828_스택 {
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(in.readLine());

        Stack<Integer> stack = new Stack<>();

        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
        while(N-->0){
            st = new StringTokenizer(in.readLine());
            switch(st.nextToken()){
                case "pop":
                    if(!stack.empty()) sb.append(stack.pop());
                    else sb.append(-1);
                    sb.append("\n");
                    break;
                case "size":
                    sb.append(stack.size()).append("\n");
                    break;
                case "empty":
                    if(stack.empty()) sb.append(1);
                    else sb.append(0);
                    sb.append("\n");
                    break;
                case "top":
                    if(!stack.empty()) sb.append(stack.peek());
                    else sb.append(-1);
                    sb.append("\n");
                    break;
                default:
                    stack.push(Integer.parseInt(st.nextToken()));
                    break;
            }
        }

        System.out.println(sb);
    }
}

 

2) 배열 사용

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ_10828_스택 {
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(in.readLine());

        int[] stack = new int[10001];
        int top = -1;

        StringBuilder sb = new StringBuilder();
        StringTokenizer st;

        while(N-->0){
            st = new StringTokenizer(in.readLine());
            switch(st.nextToken()){
                case "pop":
                    if(top==-1) sb.append("-1\n");
                    else sb.append(stack[top--]).append("\n");
                    break;
                case "size":
                    sb.append(top+1).append("\n");
                    break;
                case "empty":
                    if(top==-1) sb.append("1\n");
                    else sb.append("0\n");
                    break;
                case "top":
                    if(top==-1) sb.append("-1\n");
                    else sb.append(stack[top]).append("\n");
                    break;
                default:
                    stack[++top] = Integer.parseInt(st.nextToken());
                    break;
            }

        }

        System.out.print(sb);
    }
}

 


2. 결과

배열을 사용하는 방식이 API보다 시간, 메모리면에서 더 빨랐다.

API를 사용하면 함수 호출을 여러번 하게되는데 그 차이가 아닐까 싶다.

실제 Stack.java를 살펴보면 내가 배열로 짠 방식과 비슷하게 구현돼있다. 다른 점은 스택 스스로 길이를 늘리는 것, pop한 뒤 null로 그 자리를 채우는 것인데, 이 문제에서는 필요 없을 것 같아 추가하지 않았다.

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 17298 오큰수 - JAVA  (0) 2022.02.05
[BOJ] 1874 스택수열 - JAVA  (0) 2022.02.05
[BOJ] 4949 균형잡힌 세상 - JAVA  (0) 2022.02.05
[BOJ] 9012 괄호 - JAVA  (0) 2022.02.05
[BOJ] 10772 제로 - JAVA  (0) 2022.02.05

댓글