Swift) 백준 2504번 괄호의 값 - S1

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

 

2504번: 괄호의 값

4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일 X

www.acmicpc.net

접근 방식 : 스택을 이용하여 접근. (X) 와 [X]는 X의 값에다가 2또는 3을 곱한 값이고 ()와 []는 2와 3을 반환한다. ()와 [] 내부에 아무것도 들어 있지 않지만 1이 들어 있다고 가정하면 결국 X값이 들어있는 괄호나 X가 들어있지 않는 값이나 계산방식은 똑같은 점을 이용해 풀었다.

 

풀이 과정: 

인풋값은 "(([]()))"가 들어간다고 가정.

 

괄호가 시작되는 경우 괄호스택에 괄호 입력하고, 숫자 스택에 0을 입력.

괄호가 닫히면 쌍인지 확인. 쌍인 경우 숫자 스택에서 0이 나올때까지 pop을 진행. flag값을 확인하여 닫힌 괄호가 ()인지 (X)인지 확인.

()라면 괄호의 값을 숫자 스택에 넣고, (X)하면 pop할때까지 나온 값들을 더한 후 괄호의 값을 곱하고 숫자 스택에 넣음.

이 과정을 입력된 괄호 문자열을 모두 돌때까지 반복한다.

)가 를 만났으므로 0을 만날때까지 숫자스택 pop. pop한 숫자들을 모두 더하고 괄호값을 곱함.

또 )를 만났으므로 다시 위 절차 진행.

괄호 문자열을 모두 돌았으므로 마지막으로 괄호스택이 비었는지 안비었는지 체크. 비어있지 않는 경우 맞아 떨어지지 않는 문자열이니 0반환, 비어있는 경우 정상적인 문자열이니 계산한 값 출력.

 

코드:

import Foundation

let arr = Array(readLine()!)
var stack: [Character] = []
var numStack: [Int] = []

func solution(input: [Character]) -> Int {
    
    for i in input {
        if i == "(" || i=="[" {
            numStack.append(0)
            stack.append(i)
        } else {
            if !stack.isEmpty {
                let popElement = stack.removeLast()
                var currentInput = 0
                if i == ")" {
                    if popElement != "(" {
                        return 0
                    }
                    currentInput = 2
                } else {
                    if popElement != "[" {
                        return 0
                    }
                    currentInput = 3
                }
                var sum = 0
                var flag = false
                while true {
                    let popNum = numStack.removeLast()
                    if popNum == 0 {
                        if !flag {
                            numStack.append(currentInput)
                        } else {
                            numStack.append(sum * currentInput)
                        }
                        break
                    } else {
                        flag = true
                        sum += popNum
                    }
                }
            } else {
                return 0
            }
        }
    }
    if stack.isEmpty {
       return numStack.reduce(0, +)
    }
    return 0
}

print(solution(input: arr))