[Swift] [10일차] 올바른괄호

·2024년 12월 17일
0

SwiftAlgorithm

목록 보기
13/105
post-thumbnail

Programmers-올바른괄호

괄호 문제 답게 스택을 활용하는 것으로 보였다. 이전에 풀어봤던 내용이라 어렵지 않게 제출할 수 있었다.

제출 코드

import Foundation

func solution(_ s: String) -> Bool {
    var ans = false

    var stack: [Character] = []
    for item in s {
        if item == "(" {
            stack.append(item)
        }
        else {
            if stack.last! == "(" {

                stack.popLast()
            }
        }
    }
    return stack.isEmpty ? true : false
}

스택 배열을 만들어주고 여는 괄호 (가 있을 때만 ! 넣어주고 마지막 원소랑 비교하면서 닫히는게 나오면 닫히는걸 넣지말고 마지막 원소를 이제 pop해주는 방식으로헤서 배열안에 원소가 남냐 안남냐로 판단해주면 된다! (일반적인 스택 풀이 방식)

오잉

틀렸네 ?


틀린 예제는")()(" 였는데, 자세히 보니 스택자체가 비어있을 때에 )가 들어오면 비어있는 배열에서 popLast()를 물으니 이게 펑하고 터져버린 것이었다.
그래서 이를 위해서 조건을 하나 달아주면...!

 if stack.isEmpty {return false}

해결!

완성코드

import Foundation

func solution(_ s: String) -> Bool {
    var ans = false

    var stack: [Character] = []
    for item in s {
        if item == "(" {
            stack.append(item)
        }
        else {
            if stack.isEmpty {
                return false
            }
            if stack.last! == "(" {
                stack.popLast()
            }
        }
    }
    return stack.isEmpty ? true : false
}

타인의 코드

import Foundation

func solution(_ s:String) -> Bool
{
    var ans:Bool = false

    var openCnt: Int = 0, closeCnt: Int = 0

    for ch in s {
        switch ch {
        case "(":
            openCnt += 1
        case ")":
            closeCnt += 1
        default:
            break
        }

        guard openCnt >= closeCnt else {
            break
        }
    }

    ans = openCnt == closeCnt

    return ans
}

다음과 같이 나와 있었는데 switch 활용해서 가독성이 높게 느껴졌고, 나중에 여러가지 괄호가 있을 때 더 유용한 코드같아 보였다.
guard 자체가 너무 생소해서 볼 때마다 새로운데, 여기서는 closeCnt가 더 커져버린 순간 터져버리도록 유도해서 에러를 방지한 것으로 보였다.

또 사소하게 얻어간 내용은
var openCnt: Int = 0, closeCnt: Int = 0 이렇게 한줄로 쉼표 활용해서 선언 여러개 해줄 수 있구나 하는정도 가져갈 수 있었다

profile
기억보단 기록을

0개의 댓글