본문 바로가기

알고리즘풀이

LeetCode: Valid Parentheses

문제설명

  • 문자열 s는 다음 3가지 종류의 괄호를 갖는다. '(', ')', '{', '}', '[', ']',
  • 괄호가 적절하게 닫혔는지를 판별하라.

문제풀이

  • 여는 괄호라면, stack에 넣는다.
  • 여는 괄호가 아니라면, stack에서 값을 가져와서 현재 괄호와 비교한다.
  • 만약 stack이 비어있다면, 여는 괄호 없이 닫는 괄호가 먼저 나왔다는 것이므로 false를 리턴한다.
  • 주의할점은 swift의 removeLast()가 아닌, popLast()를 사용해야 옵셔널로 반환한다.
func isValid(_ s: String) -> Bool {
    let strArray = Array(s)

    var stack = [Character]()

    for par in strArray {
        if isOpenParenthese(par) {
            stack.append(par)
        } else if !isPairWith(stack.popLast(), par) {
            return false
        }
    }
    return stack.isEmpty
}

func isPairWith(_ lhs: Character?, _ rhs: Character?) -> Bool {
    guard let lhs = lhs, let rhs = rhs else { return false }
    if lhs == "(" && rhs == ")" { return true }
    if lhs == "[" && rhs == "]" { return true }
    if lhs == "{" && rhs == "}" { return true }
    return false
}

func isOpenParenthese(_ par: Character) -> Bool {
    if (par == "(" || par == "[" || par == "{") {
        return true
    } else {
        return false
    }
}

print(isValid("[()]")) // true
print(isValid("([)]")) // false
print(isValid("()[]{}")) // true
print(isValid("(")) // false
print(isValid("]")) // false