Uknow's Lab.
article thumbnail

 

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

 

10828번: 스택

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

www.acmicpc.net

 

 

난이도 : 실버 4
알고리즘 분류 : 자료구조, 스택

 

 

 

스택(Stack) 자료구조를 이용하여 풀 수 있는 문제 입니다.

 


소스코드

import java.io.BufferedReader
import java.io.InputStreamReader

lateinit var stack: IntArray
var ptr = -1

fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val testCase = br.readLine()!!.toInt()

    stack = IntArray(testCase)


    for (i in 0 until testCase) {
        when (val input = br.readLine()) {
            "top" -> println(top())
            "pop" -> println(pop())
            "empty" -> println(isEmpty())
            "size" -> println(size())
            else -> push(input.split(" ")[1].toInt())
        }
    }
}

fun pop(): Int {
    return if (ptr == -1) -1 else stack[ptr--]
}

fun push(n: Int) {
    stack[++ptr] = n
}

fun isEmpty(): Int {
    return if (ptr == -1) 1 else 0
}

fun size(): Int {
    return ptr + 1
}

fun top(): Int {
    return if (ptr == -1) -1 else stack[ptr]
}

 

 

소스코드 설명

처음에는 ArrayList를 사용하여 접근하려 했으나 역시나 시간초과가 뜬 관계로

 

배열과 스택의 top을 가리킬 ptn 변수를 통해 구현하였고,

 

입출력 속도 관계로 readLine()이 아닌 자바의 bufferedReader를 사용하였습니다.

 

stack 배열의 크기는 어차피 인풋으로 주어지는 라인 수 보다는 적을 것이기에, 인풋으로 주어지는 라인수에 맞춰 배열의 크기를 할당하였습니다.

 

 

스택의 구현에 관해서는 pop, push, size, top, isEmpty를 주로 보면 됩니다.

 

fun pop(): Int {
    return if (ptr == -1) -1 else stack[ptr--]
}

pop은 스택에서 값을 꺼내는 함수로써, ptr이 -1일 경우( 값이 하나도 없을 경우) -1을 반환,

그렇지 않을 경우 꺼낸 값을 반환합니다

 

여기서, ptr이 0이 아닌 -1인 이유는,

ptr이 0일 경우 인덱스가 0인 것을 의미하며, 배열의 경우 인덱스가 0부터 시작하기에

해당 스택 비어있지 않다고 할 수 있습니다.

 

 

fun push(n: Int) {
    stack[++ptr] = n
}

push는 스택에 값을 입력하는 함수로써, ptr의 값을 1만큼 증가시키고 해당 위치에 입력받은 값을 저장합니다.

 

 

fun isEmpty(): Int {
    return if (ptr == -1) 1 else 0
}

isEmpty의 경우 스택이 비어있으면 (ptr == -1) 1을, 그렇지 않다면 0을 반환합니다.

 

fun size(): Int {
    return ptr + 1
}

size 함수는 스택의 크기를 반환합니다.

스택의 인덱스가 0부터 시작하기에 +1만큼 하였습니다.

 

fun top(): Int {
    return if (ptr == -1) -1 else stack[ptr]
}

top은 스택의 최상단에 위치한 값을 반환합니다. 스택이 비어있을 경우, -1을 반환합니다.

 

 

 


profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.