[스택] 백준 - 10828

경운·2025년 10월 23일

[BOJ / 백준]

목록 보기
15/21
post-thumbnail

BOJ/백준 10828 - 스택

해당 문제는 친절하게 어떤거 쓰고 어떻게 쓰이는 지 알려주고 있다

우선 코드에서 사용한 스택 함수를 보여드리겠습니다

스택 함수설명
push()스택의 맨 위 요소 추가
pop()스택에서 맨 위에 있는 정수 반환 후 제거
size()스택의 크기 반환
isEmpty()스택에 원소가 없으면 'True', 있으면 'False'
peek()스택의 맨 위 요소를 삭제하지 않고 반환

💡isEmpty() 는 boolean 값을 반환하므로 코드에선 1과 0으로 변경해줘야 함


백준 10828 - 스택

1. 문제 분석

문제 이해

정수를 저장하는 스택을 구현 후 명령을 처리하는 프로그램 만들어보자
명령1. push X → X를 스택에 넣기
명령2. pop → 스택에서 가장 위에 있는 정수를 빼고, 그 수 출력 만약 스택에 정수가 없으면 -1 출력
명령3. size → 스택에 들어있는 정수의 개수 출력
명령4. empty → 스택이 비어있으면 1, 아니면 0 출력
명령5. top → 스택에 가장 위에 있는 정수 출력, 만약 스택에 정수가 없으면 -1

입력

  • 첫째 줄에 주어지는 명령의 개수 N → (1 <= N <= 10,000)
  • 둘째 줄부터 명령이 하나씩 주어짐 → (1 <= 명령 <= 100,000)

단, 문제에 나와있지 않은 명령이 주어지는 경우는 없음

출력

명령 한 줄당 결과도 하나씩 출력

2. 시간 복잡도

  • N개의 명령어 만큼 반복해야하니까 → O(N)
  • 나머지 스택 연산들은 → O(1)

💡for문이 한 번 돌때마다 스택 연산이 한 번씩 일어나기 때문에 총 시간 복잡도는 O(N)

3. 코드 구현

import java.io.*;
import java.util.*;

public class No_10828 {
	
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		Stack<Integer> stack = new Stack<>();
		StringBuilder sb = new StringBuilder();
		
		for(int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			String s = st.nextToken();
			
			switch(s) {
			case "push" :
				stack.push(Integer.parseInt(st.nextToken()));
				break;
				
			case "pop" :
				if(stack.isEmpty()) {
					sb.append("-1\n");
				} else {
					sb.append(stack.pop()).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.peek()).append("\n");
				}
				break;
			}
		}
		System.out.println(sb);
	}
}

0개의 댓글