알고리즘/백준

[백준] 1874번 : 스택 수열 - 코틀린(kotlin)

Junuuu 2022. 11. 10. 00:01
반응형

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

 

1874번: 스택 수열

1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.

www.acmicpc.net

 

 

문제 해석

1~n까지의 수를 스택에 넣을 수 있다.
어떠 수열이 주어졌을 때 push, pop연산으로 스택을 이용하여 해당 수열을 만들 수 있는지 알아내 보자.

예시 수열 : 4 3 6 8 7 5 2 1
1~8까지의 수가 존재함


push : 1
push : 1 2
push : 1 2 3
push : 1 2 3 4
pop : 1 2 3  (수열 4)
pop : 1 2  (수열 4 3)
push : 1 2 5
push : 1 2 5 6
pop : 1 2 5 (수열 4 3 6)
push : 1 2 5 7 (수열 4 3 6)
push : 1 2 5 7 8 (수열 4 3 6)
pop : 1 2 5 7 (수열 4 3 6 8 )
pop : 1 2 5 (수열 4 3 6 8 7)
pop : 1 2 (수열 4 3 6 8 7 5)
pop : 1 (수열 4 3 6 8 7 5 2)
pop : (수열 4 3 6 8 7 5 2)


수열 만들어짐

 

코드

import java.util.*
fun main() {
    val count = readLine()!!.toInt()
    val stack = Stack<Int>()
    val sequence = LinkedList<Int>()
    
    repeat(count) {
        sequence.add(readLine()!!.toInt())
    }

    val stringBuilder = StringBuilder()
    for (index in 1..count) {
        stack.push(index)
        stringBuilder.append("+\n")
        while (stack.isNotEmpty() &&
            sequence.isNotEmpty() &&
            stack.peek() == sequence.first
        ) {
            sequence.pollFirst()
            stack.pop()
            stringBuilder.append("-\n")
        }
    }
    if(stack.isEmpty()){
        println(stringBuilder.toString())
    } else{
        println("NO")
    }
}