CodingTest/Baekjoon

[백준] 28278 스택 2 자바 문제풀이

mingmongs 2025. 3. 24. 10:00

title

문제

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

 

문제링크

img1
img2

 

1) 문제 이해

: 자료구조의 Stack은 후입선출(LIFO, Last In First Out) 방식으로 동작하는 선형 자료 구조이다.

 

2) 문제 풀이 1

2-1) 코드

import java.util.Scanner;
import java.util.Stack;

public class Main {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        Stack<Integer> stack = new Stack<>();

        for(int i = 0; i < n; i++) {
            int command = input.nextInt();
            switch(command) {
                case 1: 
                    stack.push(input.nextInt());
                    break;
                case 2:
                    if(stack.size() > 0) {
                        System.out.println(stack.pop()); 
                    } else {
                        System.out.println(-1);
                    }
                    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());
                    }
            }
        }
    }
}

2-2) 문제점

img3

위의 코드로 정답을 제출한 결과, "시간 초과" 라는 결과가 나오게 되었다.

 

3) 문제 풀이 2

이렇게 코딩테스트를 풀다 보면, 시간 초과의 원인으로 자주 언급되는 내용은 Scanner의 사용이였다.
Scanner로 값을 읽어들일 때 가장 큰 단점은 "속도"이기 때문에,
BufferedReader를 활용하여 다시 문제를 풀어보기로 했다.

3-1) 코드

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(br.readLine());
        Stack<Integer> stack = new Stack<>();

        for(int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int command = Integer.parseInt(st.nextToken());
            switch(command) {
                case 1: 
                    stack.push(Integer.parseInt(st.nextToken()));
                    break;
                case 2:
                    if(stack.size() > 0) {
                        bw.write(stack.pop() + "\n"); 
                    } else {
                        bw.write(-1 + "\n");
                    }
                    break;
                case 3:
                    bw.write(stack.size() + "\n");
                    break;
                case 4:
                    if(stack.isEmpty()) {
                        bw.write(1 + "\n");
                    } else {
                        bw.write(0 + "\n");
                    }
                    break;
                case 5:
                    if(stack.isEmpty()) {
                        bw.write(-1 + "\n");
                    } else {
                        bw.write(stack.peek() + "\n");
                    }
            }
        }
        bw.flush();
        bw.close();
        br.close();
    }
}

3-2) 결과

img4

 

 

[reference]
https://velog.io/@alkwen0996/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%8A%A4%ED%83%9DStack