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