개발 공부/코딩테스트

99클럽 코테 스터디 12일차 TIL - 스택

죽밥죽밥화이팅 2024. 11. 8. 23:47

문제

백준 10828 [스택]

문제 링크:  https://www.acmicpc.net/problem/10828

 

해결 방법

  • push, pop 메소드를 제공하는 Deque 사용
  • switch-case문을 사용하여 스택 명령어 처리
    • push X: 스택에 값을 추가
    • pop: 스택에서 최상위 값을 제거하고 출력 / 스택이 비어있으면 -1을 출력
    • size: 스택의 크기를 출력
    • empty: 스택이 비어있는지 여부를 1(비어있음) 또는 0(비어있지 않음)으로 출력
    • top: 스택의 최상위 값을 출력 / 스택이 비어있으면 -1을 출력


코드

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

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

        Deque<Integer> stack = new ArrayDeque<>();
        StringBuilder sb = new StringBuilder();

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

            switch (st.nextToken()) {
                case "push":
                    int value = Integer.parseInt(st.nextToken());
                    stack.push(value);
                    break;

                case "pop":
                    sb.append(stack.isEmpty() ? -1 : stack.pop()).append("\n");
                    break;

                case "size":
                    sb.append(stack.size()).append("\n");
                    break;

                case "empty":
                    sb.append(stack.isEmpty() ? 1 : 0).append("\n");
                    break;

                case "top":
                    sb.append(stack.isEmpty() ? -1 : stack.peek()).append("\n");
                    break;
            }
        }

        System.out.print(sb);
    }
}

 


 

  • 참고할 다른 풀이 방법
더보기

ArrayList로 직접 구현

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        
        // ArrayList를 사용하여 스택을 구현
        ArrayList<Integer> stack = new ArrayList<>();
        int N = Integer.parseInt(br.readLine());  // 명령어의 수

        for (int i = 0; i < N; i++) {
            String[] command = br.readLine().split(" ");
            
            switch (command[0]) {
                case "push":
                    int value = Integer.parseInt(command[1]);
                    stack.add(value);  // 스택의 끝에 추가
                    break;
                case "pop":
                    if (stack.isEmpty()) {
                        sb.append("-1\n");
                    } else {
                        sb.append(stack.remove(stack.size() - 1)).append("\n");  // 마지막 요소 제거 및 출력
                    }
                    break;
                case "size":
                    sb.append(stack.size()).append("\n");
                    break;
                case "empty":
                    if (stack.isEmpty()) {
                        sb.append("1\n");
                    } else {
                        sb.append("0\n");
                    }
                    break;
                case "top":
                    if (stack.isEmpty()) {
                        sb.append("-1\n");
                    } else {
                        sb.append(stack.get(stack.size() - 1)).append("\n");  // 마지막 요소 출력
                    }
                    break;
            }
        }
        System.out.print(sb);
    }
}

 

  • while문 활용
import java.util.*;
import java.io.*;
public class Main
{
	public static void main(String[] args) throws Exception{
	   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	   
	   Deque<Integer> stack = new ArrayDeque<>();
	   StringBuilder sb = new StringBuilder();
	   int N = Integer.parseInt(br.readLine());
	   StringTokenizer st;
	   while(N-- > 0){
	       st = new StringTokenizer(br.readLine());
	       String exec = st.nextToken();
	       if(exec.equals("push")) {stack.push(Integer.parseInt(st.nextToken()));
	            continue;
	           
	       }
	       
	       else if(exec.equals("pop")) sb.append(stack.isEmpty() ? -1 : stack.pop());
	       else if(exec.equals("size")) sb.append(stack.size());
	       else if(exec.equals("empty")) sb.append(stack.isEmpty() ? 1 : 0);
	       else sb.append(stack.isEmpty() ? -1 : stack.peek());
	       sb.append('\n');
	   }
	   System.out.println(sb);
	}
}