상세 컨텐츠

본문 제목

스택 수열(백준)

코딩테스트

by dofury 2023. 7. 13. 14:07

본문

728x90

package com.example.algorithm

import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.util.*
import java.util.Collections.max
import java.util.Collections.min


fun main(){

    val br = BufferedReader(InputStreamReader(System.`in`))
    //val bw = BufferedWriter(OutputStreamWriter(System.`out`))

    val count = br.readLine().toInt()

    val stack = Stack<Int>()
    var max = 0
    var pop = 0
    var noCheck = false
    val result = mutableListOf<Char>()
    for(_i in 1..count){
        val input = br.readLine().toInt()


        if(pop == 0 || pop<=input){
            for(i in max+1..input){
                stack.push(i)
                result.add('+')
            }
        }
        while(input != pop){
            if(stack.empty()){
                noCheck = true
                break
            }
            pop = stack.pop()
            result.add('-')

        }
        if(noCheck)
            break


        if(max < pop){
            max = pop
        }
    }
    if(noCheck){
        println("NO")
    }
    else{
        for(ch in result){
            println(ch)
        }
    }
    br.close()

}

문제가 이해 안되서 유튜브에 있는 스택 수열을 알려주는 영상을 보며 이해를 한다음 풀었다.

알고리즘 원리는

1부터 스택을 쌓아가면서 push(+) 입력한수를 만나면 pop(-)하고 다음 수로 넘어간다.

그다음 부터가 중요하다. pop해왔던 수들의 max를 기억하고

max보다 작으면 계속 pop(-) 해서 찾고

max보다 크면 max 다음 수부터 push(+) 해서 찾는다.

이 때 pop(-)해서 못찾으면 스택 수열이 아닌 것이다.

 

백준 사이트에서 설명이 부족한 문제의 경우는 코딩 구현이 어렵지 않은 문제도 어려워 지는 경향이 있어서

설명을 이해하기 쉽고 상세하게 적어줬으면 좋을 것 같긴하다.

728x90

'코딩테스트' 카테고리의 다른 글

비밀번호 찾기(백준)  (0) 2023.07.18
이장님 초대(백준)  (0) 2023.07.14
제로(백준)  (0) 2023.07.12
설탕 배달(백준)  (0) 2023.07.11
나이순 정렬(백준)  (0) 2023.07.10

관련글 더보기

댓글 영역