잡초의 일지

[Swift] 프로그래머스 | 코딩테스트 연습 -> 연습문제 -> 올바른 괄호 본문

[코딩] 문제풀기/Swift

[Swift] 프로그래머스 | 코딩테스트 연습 -> 연습문제 -> 올바른 괄호

JabCho 2020. 7. 28. 13:04
728x90
반응형
SMALL
func solution(_ s:String) -> Bool
{
    var ans:Bool = false
    let arr: [Character]? = Array(s)
    var stack: [Character] = []
    if let arr = arr {
        if arr[0] != ")" {
            for index in arr {
                if index == "(" {
                    stack.append("(")
                }else{
                    if stack.count > 0 {
                        stack.remove(at: stack.count-1)
                    }
                }
            }
            if stack.count < 1 {
                ans = true
            }else{
                ans = false
            }
        }else{
            ans = false
        }
    }
    return ans
}

 

signal: illegal instruction (core dumped) 이라는 에러가 자꾸 뜨면서 테스트에서 실패했다.

이 에러는 배열이 index out of range거나, 옵셔널, 혹은 잘못된 수식 때문에 생긴다고 하였다.

index out of range인 경우나 옵셔널이 문제인것 같았다.

그래서 혹시 stack 배열 문제인가 싶어서 stack의 배열이 무언가 있을때만 remove하도록 했더니, 작동되었다.

 

그러나, 얼핏 보기에도 많은 for와if문의 난도질 같다는 느낌이 든다.

그래서 다른 사람들의 코드를 보면서 최적 코드는 무엇인지 보았다.

 

그러고 나서 생각해봤더니, 

 

무조건 처음에 ")" 이 나오는경우는 false이고, 무조건 "(" 부터 시작한다.

그리고 ")" 이 있으면 하나의 괄호가 완성되는것이다. 

그렇게 치면, "("")" 이 하나의 완성된 괄호 쌍을 이루는 것이다. 따라서 true가 되려면 "("의 갯수와 ")"의 갯수가 같아야 한다.

 

그래서 다른 코드를 참고해서 위의 생각대로 코드를 짜 보았다. (이게 정확성 & 효율성이 더 높았다.)

 

func solution(_ s:String) -> Bool
{
    var ans:Bool = false
    var openCharacterCount: Int = 0, closeCharacterCount: Int = 0
    
    for index in s {
        
        switch index {
            case "(":
                openCharacterCount += 1
            case ")":
                closeCharacterCount += 1
            default:
                break
        }

        guard openCharacterCount >= closeCharacterCount else {
            break
        }
    }

    ans = openCharacterCount == closeCharacterCount

    return ans
}

 

그리고 무조건 "("")" 보다 많거나 둘의 갯수가 같아야 한다. 아니라면, 괄호의 짝이 잘못되었으므로 false이다.

 

 

 

 

728x90
반응형
LIST
Comments