[백준] S4 28278번 스택 2 (Java)

숙취엔 꿀물.·2023년 11월 22일

백준(Backjoon)

목록 보기
2/15

https://www.acmicpc.net/problem/28278

👉문제

이번 문제도 실버4 문제이고, 스택의 기본 연산을 알고 있다면 쉽게 풀 수 있다.
1. 명령어의 수 N을 입력받고
2. 주어진 문제의 명령을 구현한 후 출력하면 끝

물론 코드를 어떻게 구성하느냐에 따라 속도 차이는 있을 수 있다.

👉풀이

  1. BufferedReader, StringBuilder, StringTokenizer, Stack + 메소드의 이용
package Baekjoon;

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

public class _28278_1 {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(br.readLine()); // 명령어의 수
        Stack<Integer> stack = new Stack<>();
        StringTokenizer st;

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine(), " ");

            switch (st.nextToken()) {
                case "1": stack.push(Integer.parseInt(st.nextToken())); 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;
            }
        }

        System.out.println(sb);
    }
}
  1. 혹시나 조건문을 삼항연산자로 사용하면 속도 차이가 있을까 싶어 바꿔보았더니 약간은 빨라진다는 것을 알 수 있었다. 속도 비교는 아래에서--(반복문의 코드만)
for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine(), " ");

            switch (st.nextToken()) {
                case "1" : stack.push(Integer.parseInt(st.nextToken())); break;
                case "2" : sb.append(stack.isEmpty() ? -1 : stack.pop()).append("\n"); break;
                case "3" : sb.append(stack.size()).append("\n"); break;
                case "4" : sb.append(stack.isEmpty() ? 1 : 0).append("\n"); break;
                case "5" : sb.append(stack.isEmpty() ? -1 : stack.peek()).append("\n"); break;
                default: break;
            }
        }
  1. main 메소드에서 전부 처리하는 것이 아닌 함수를 거치면 빨라질까 하여 해보았을때는 별 차이가 없었으므로 코드 첨부는 하지 않겠지만, 이후에 StringTokenizer가 아닌 br.readLine()으로 입력받은 값으로만 사용해봤더니 한 차례 더 성능개선이 있었다..!
package Baekjoon;

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

public class _28278_4 {
    static StringBuilder sb = new StringBuilder();
    static Stack<Integer> stack = new Stack<>();

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine()); // 명령어의 수

        while(N-- > 0){
            solution(br.readLine());
        }

        br.close();
        System.out.println(sb);
    }

    static void solution(String input){
        char c = input.charAt(0);

        switch (c){
            //case 1의 경우 query.substring(2);를 한 이유는 공백도 문자로 포함하기 때문이다 1 X 형태이기 때문에 X의인덱스는 2다.
            case '1' : stack.push(Integer.parseInt(input.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;
            default: break;
        }
    }
}

👉성능

위에서 부터 순서대로

채점 번호 : 69580722 - 방법 3 - StringTokenizer 사용 x
채점 번호 : 69580392 - 방법 2 - 조건문 -> 삼항연산자
채점 번호 : 69579891 - 방법 1 - BufferedReader, StringBuilder, StringTokenizer, Stack + 메소드의 이용

진짜 조그마한 차이지만 속도 차이가 난다는게 신기할 따름이다. 아무래도 속도 자체는 컴퓨터를 위한 코드가 가장 빠르건가 싶다.

profile
단단하게 오래가고자 하는 백엔드 개발자

0개의 댓글