Algorithm/코알못 알고리즘 스터디

[6월 첫째 주 #5-1][알고리즘] 백준 10828번 : 스택

developo6 2022. 6. 2. 23:53

이번 주 문제

1️⃣  백준 10828번 : 스택
2️⃣  프로그래머스 42586번 : 기능 개발

 


1️⃣  백준 10828번 : 스택

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 


 

⎈ 문제 분석

스택을 구현하는 문제인데, 자바에서 잘 구현되어있는 Stack 클래스를 이용하는게 최선일 것 같다.. 입력을 처리하는 로직만 잘 구현하면 어렵지 않을 것 같다.

 

⎈ 코드

import java.io.*;
import java.util.ArrayList;
import java.util.Stack;
import java.util.regex.Pattern;

public class Main{
    public static void main(String[] args) throws IOException {
        // 입력받은 명령어들을 ArrayList에 저장
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        String sizeStr = reader.readLine();
        int size = Integer.parseInt(sizeStr);

        ArrayList<String> inputArrList = new ArrayList<>();

        for(int i=0;i<size;i++) {
            inputArrList.add(reader.readLine());
        }

        // Stack 클래스 객체를 만들고 각 명령어 및 조건에 맞도록 동작하게 구현.
        Stack<Integer> stack = new Stack<>();

        String pushPattern = "^(push )+[0-9]*$";
        String input="";
        String[] strArr=new String[2];

        for(int i=0;i<size;i++){
            input=inputArrList.get(i);
            if(input.matches(pushPattern)){
                strArr = input.split(" ");
                input = strArr[0];
            }
            switch(input){
                case "push":
                    stack.push(Integer.parseInt(strArr[1]));
                    break;
                case "pop":
                    if(stack.isEmpty())
                        System.out.println(-1);
                    else
                        System.out.println(stack.pop());
                    break;
                case "size":
                    System.out.println(stack.size());
                    break;
                case "empty":
                    if(stack.isEmpty())
                        System.out.println(1);
                    else
                        System.out.println(0);
                    break;
                case "top":
                    if(stack.isEmpty())
                        System.out.println(-1);
                    else
                        System.out.println(stack.peek());
                    break;
            }
        }
    }
}

push 의 경우에만 띄어쓰기 한 칸과 숫자가 입력되므로, 정규표현식을 이용하여 push인 경우를 찾아 처리하도록 해주었다. 이후 Stack 클래스를 그대로 이용하여 조건에 맞게 출력하도록 구현하였다. 

인텔리제이에서 입출력 예시를 이용해 테스트했을 때, 동작은 제대로 하였지만 시간초과가 발생하였다. 몇 가지 단순한 수정을 했지만 계속 시간초과였고 다른 방향으로 구현을 해야할 것 같다.

 

⎈ 고찰

3시간 정도 작성한 것 같다. 정규표현식에 대한 기본적인 내용을 학습할 수 있었다. 시간 초과에 대해 어떻게 대응해야 하는 지는 조사해봐야겠다.