👨🏻‍💻iOS 공부/Swift_알고리즘 풀이

[프로그래머스] 올바른 괄호

728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/12909?language=swift 

 

코딩테스트 연습 - 올바른 괄호

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어 "()()" 또는 "(())()" 는 올바른 괄호입니다. ")()(" 또는 "(()(" 는 올바르지 않은

programmers.co.kr

 

카카오 괄호 변환 문제와 아주 조금 겹치는 부분이 있다.

(괄호가 올바른지 아닌지 판단하는 부분)

 

https://programmers.co.kr/learn/courses/30/lessons/60058?language=swift 

 

코딩테스트 연습 - 괄호 변환

카카오에 신입 개발자로 입사한 "콘"은 선배 개발자로부터 개발역량 강화를 위해 다른 개발자가 작성한 소스 코드를 분석하여 문제점을 발견하고 수정하라는 업무 과제를 받았습니다. 소스를

programmers.co.kr

 

아무튼 괄호는 "("로 열어주고 ")"로 닫아줘야 올바르다고 판단한다. 

하지만 괄호를 규칙적으로 ()처럼만 쓰지는 않는다. (())() 이런 식으로도 사용하기도 한다. 쌍이 잘 맞는지 확인하는 것이 중요하다. 

 

"("를 +1, ")"를 -1로 생각해보면 처음부터 끝까지 더한다면 최종 값은 0이 되어야 올바른 괄호라고 판단할 수 있다. 

하지만 이 경우도 예외는 있는데, ")(()"처럼 거꾸로 된 경우에 문제가 된다.

 

이를 방지하기 위해 도중에 합이 0보다 작아지는 경우는 바로 올바르지 않다고 판단해준다. 즉 거꾸로 된 괄호가 많은 것을 선별해낼 수 있는 것이다. 

 

위 케이스들을 고려해서 코드로 작성해보면 다음과 같다. 

 

import Foundation

func solution(_ s:String) -> Bool {
    // 올바른지 여부를 체크
    var state = true
    // 괄호의 연산 값
    var res = 0
    
    for bracket in s {
        // 도중에 합이 0보다 작아질 경우 )가 (보다 많아지는 상황
        if res < 0 {
            state = false
            break
        }
        // "(" 이라면 +1, ")"일 경우 -1
        res += bracket == "(" ? 1 : -1
    }
    // 최종적으로 0보다 크다면 (가 남는 상황인 것
    if res != 0 {
        state = false
    }
    
    return state
}

그리 어렵지는 않은 문제! 2단계 같지는 않다! (다른 2단계 문제들에 비하면...)

 

끄읕

728x90
반응형