https://www.acmicpc.net/problem/2504
접근 방식 : 스택을 이용하여 접근. (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))
'Algorithm > 백준' 카테고리의 다른 글
Swift) 백준 2468번 안전영역 - S1 (1) | 2023.06.06 |
---|---|
Swift) 백준 14500번 테트로미노 - G4 (0) | 2023.06.05 |
Swift) 백준 17619번 개구리점프 - G3 (0) | 2023.06.04 |
백준 10870: 피보나치 수 5(Swift) (0) | 2021.09.10 |
백준 10872번: 팩토리얼(Swift) (0) | 2021.09.05 |