PS(Problem Solving)/BOJ

[백준/BOJ] 10828번: 스택

JunsuKim 2021. 11. 28.
728x90

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

 

10828번: 스택

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

www.acmicpc.net

문제

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 다섯 가지이다.

  • push X: 정수 X를 스택에 넣는 연산이다.
  • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 스택에 들어있는 정수의 개수를 출력한다.
  • empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
  • top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

해설

stack을 이용하여 쉽게 풀 수 있는 문제이지만 직접 구현을 해보기 위해 배열을 만들어 각 명령에 따라 작동하는 방식을

구현해보았다.

우선 위치를 표기해줄 top이라는 변수를 -1로 선언했다.

명령문이

1. push -> top++를 하여 배열[0]에 입력한 값이 들어가게 한다.

2. pop -> top이 -1이라면 스택이 비어있는 경우이므로 -1을 출력하고 아니라면 stack[top]을 출력한 후 top--를 통해

원래의 top위치에 있는 배열을 초기화시킨다.

3. size -> top + 1만큼의 수가 들어가있으므로 이를 출력한다.

4. empty -> 비어있을 때(top = -1)라면 -1을 출력하고, 아니라면 0을 출력한다.

5. top -> 비어있을 때 -1을 출력, 아니라면 stack[top]을 출력한다.

소스 코드

배열을 이용하여 구현

import java.util.*

fun main() {
    val n = readLine()!!.toInt()
    val stack = arrayOfNulls<Int>(n)
    var top = -1
    for(i in 0 until n) {
        val st = StringTokenizer(readLine())
        val commend = st.nextToken()
        if(commend == "push") {
            val x = st.nextToken().toInt()
            top++
            stack[top] = x
        }
        else if(commend == "pop") {
            if(top == -1) println(-1)
            else {
                println(stack[top])
                top--
            }
        }
        else if(commend == "size") println(top + 1)
        else if(commend == "empty") {
            if(top == -1) println(1)
            else println(0)
        }
        else {
            if(top == -1) println(-1)
            else println(stack[top])
        }
    }
}

 스택을 이용하여 구현

import java.util.*

fun main() {
    val n = readLine()!!.toInt()
    var stack = Stack<Int>()
    for(i in 0 until n){
        val st = StringTokenizer(readLine())
        val commend = st.nextToken()
        if(commend == "push") stack.push(st.nextToken().toInt())
        else if(commend == "pop") {
            if(stack.isEmpty()) println(-1)
            else println(stack.pop())
        }
        else if(commend == "size") println(stack.size)
        else if(commend == "empty") {
            if(stack.isEmpty()) println(1)
            else println(0)
        }
        else {
            if(stack.isEmpty()) println(-1)
            else println(stack.peek())
        }
    }
}

 

728x90

댓글