알고리즘 문제 풀이

프로그래머스 - 쇠막대

블린더르 2020. 7. 28. 23:04
/*
 * 2020-07-28
 * https://programmers.co.kr/learn/courses/30/lessons/42585
 */

class IronBar {
    fun solution(arrangement: String): Int {
        /*
        val ironBarList = ArrayList<Int>()
        var answer = 0
        var prev:Char? = null
        arrangement.forEach {
            if(it == '('){
                ironBarList.add(1)
            }

            if(it == ')'){
                if(prev == '('){
                    val openCount = ironBarList.removeAt(ironBarList.count()-1) - 1
                    if(openCount > 0){
                        ironBarList.add(openCount)
                    }
                    ironBarList.add(0)
                }else{
                    ironBarList.add(-1)
                }
            }
            prev = it
        }

        var ironBarCount = 0
        ironBarList.forEach {
            if(it > 0){
                ironBarCount += 1
            }
            if(it < 0){
                answer += 1
                --ironBarCount
            }
            if(it == 0 && ironBarCount >0){
                answer += ironBarCount
            }
        }

        return answer
         */

        var answer = 0
        var prev: Char? = null
        var ironBarCount = 0

        arrangement.forEach {
            if (it == '(') {
                ironBarCount += 1
            }

            if (it == ')') {
                --ironBarCount

                answer += if (prev == '(') {
                    ironBarCount
                } else {
                    1
                }
            }
            prev = it
        }

        return answer
    }
}

fun main() {
    val result = IronBar().solution(
        "()(((()())(())()))(())"
    )
    println(result)
}

처음에는 주석된 코드로 작성했다가
생각해보니 배열로 만들어서 다시 루프를 돌려 계산하는 것이면
배열에 추가하는 시점에 계산해도 상관 없을 것 같다는 생각이 들어서
arrangement 를 읽으면서 계산하도록 수정했다

반응형