티스토리 뷰

728x90

 

https://leetcode.com/problems/valid-parentheses/description/

 

주어진 문자열(s)가 유효한지 확인

모든 열려있는 괄호는 같은 타입의 괄호로 닫혀야 함

 

 

내 풀이

class Solution {
    func isValid(_ s: String) -> Bool {
        
        guard s.count > 1 else { return false }
        
        var stack = [Character]()
        
        for char in s {
            switch char {
            case "(", "{", "[":
                stack.append(char)
            case ")":
                if stack.last == "(" {
                    stack.removeLast()
                } else {
                    return false
                }
            case "}":
                if stack.last == "{" {
                    stack.removeLast()
                } else {
                    return false
                }
            case "]":
                if stack.last == "[" {
                    stack.removeLast()
                } else {
                    return false
                }
            default:
                return false
            }
        }
        
        return stack.isEmpty
    }
}
  1. 괄호가 짝이 맞아야하니 s.count가 1이하인건 바로 false를 리턴 (guard)
  2. 변수 stack에 열린괄호"(, {, [" 가 나오면 추가
  3. 닫힌 괄호 "), }, ]"가 나오면 stack 마지막 요소에 열린괄호와 같은 타입이 있는지 확인 
  4. 있으면 stack 마지막요소 삭제 (짝 맞추기 위함)
  5. 없으면 괄호를 닫을 수 없으므로 false 리턴
  6. stack이 다 비어있으면 괄호 짝이 다 맞고, 다 닫을 수 있으니 true 리턴 

 

다른사람의 풀이

class Solution {
    func isValid(_ s: String) -> Bool {
        
        guard s.count % 2 == 0 else { return false }
        
        var stack: [Character] = []
        
        for ch in s {
            switch ch {
            case "(": stack.append(")")
            case "[": stack.append("]")
            case "{": stack.append("}")
            default:
                if stack.isEmpty || stack.removeLast() != ch {
                    return false
                }
            }
        }
        
        return stack.isEmpty
    }
}

 

날고 기는사람은 많다.. 🫠

 

  1. s.count가 홀수면 괄호가 짝이 안맞으니 false 리턴
  2. 열린괄호가 나오면 해당 타입에 맞는 닫힌괄호를 stack에 추가함
  3. 다음 요소가 열린괄호 외 다른 문자 또는 닫힌괄호일때 stack이 비어있거나, stack의 마지막요소와 같지 않으면 false 리턴

 

 

배운것

removeLast()

 

배열의 요소 마지막을 삭제하고 삭제한 요소를 리턴함.

 

var arr = ["가", "나", "다", "라"]
print("current arr: \(arr)")
let lastElement = arr.removeLast()
print("삭제된 요소: \(lastElement)")
print("current arr: \(arr)")

// current arr: ["가", "나", "다", "라"]
// 삭제된 요소: 라
// current arr: ["가", "나", "다"]
728x90