본문 바로가기
개발/알고리즘

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

by ISA(류) 2021. 8. 31.

# 문제 원문

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

  • "()()" 또는 "(())()" 는 올바른 괄호입니다.
  • ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

# 문제 풀이

입력 받은 문자열 s는 ( 또는 )로만 이루어져 있고, 서로 짝이 안맞을 수도 있고, 서로 열고 닫히는게 제대로 안되어 있을 수 있다. 정확성만 따진다면 어찌해도 상관없지만 효율성 케이스가 2개 포함된 문제이기에 서로 열고 닫는게 올바른지만 체크한다. 주어지는 문자열 길이 제한이 상당히 길게 까지 주어지므로 반복문을 사용해서 올바르지 않을시 바로 break해주는 부분이 필요하다. 문자열은 이터러블이기에 array로 만든후 내장 메서드중 하나인 some (return을 통해서 임의로 멈출 수 있다)을  활용해서 풀었다.

 

# 솔루션 플로우

1. 입력 받은 문자열 s를 순회한다.

2. 각 char이 (면 count를 ++ 해주고 )면 --해준다.

3. result가 0이하로 줄어든다면 해당 문자열은 잘못된 괄호이니 반복을 break한다.

4. 순회가 끝난 후 result가 0이면 true를 아니라면 false를 반환한다.

1. 가독성

function solution(s) {
    let result = 0;
    
    Array.from(s).some((char) => {
        char === '(' ? result++ : result--;
        if (result < 0) return true;
    })

    return result === 0;
}

2. 숏코딩

function solution(s, result = 0) {
    return !Array.from(s).some((char) => {
        char === '(' ? result++ : result--;
        if (result < 0) return true;
    }) && result === 0;
}
반응형