Programmers

[프로그래머스][JS] 괄호 회전하기 ✅

winter17 2023. 9. 25. 23:21

https://school.programmers.co.kr/learn/courses/30/lessons/76502

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 과정

function solution(s) {
    const sArr = s.split('')
    const obj = {
        '(': ')',
        '[': ']',
        '{': '}',
    }
    let cnt = 0
    for (let i = 0; i < sArr.length; i++){
        let stack = []
        let isValid = true
        for (let j = 0; j < sArr.length; j++){
            if(sArr[j] === '(' || sArr[j] === '{' || sArr[j] === '['){
                stack.push(sArr[j])
            }else{ // if문의 조건을 만족하지 못한 경우
                let openBracket = stack.pop()
                if (sArr[j] !== obj[openBracket]){
                    isValid = false
                    break
                }
            }
        }
        // console.log(i, sArr, isValid, stack)
        if (isValid && stack.length === 0){
            cnt++
        }
        const del = sArr.shift()
        sArr.push(del)
    }
    return cnt;
}
// console.log(solution('()('))

 

반복문안에 반복문에서 if조건문을 살펴볼 때 (, {, [ 중 하나가 등장하면 stack 배열에 push 하고

아니라면 stack배열에 있는 것을 하나 꺼내어 등장할 sArr[j]와 비교하여 true, false를 판단한다. 

 

예를 들어, sArr[j] = '['일 경우 첫 번째 if 조건문을 통과하므로 stack에 push를 한다.

그다음 sArr[j] = ']'일 경우 if 조건을 충족하지 못하므로 else 조건문으로 들어가 앞의 과정에서 stack에 push 했던 요소 '['를 꺼내어 비교를 하는데 ']'와 obj['['] = ']'이므로 ']' === ']' if 조건문을 통과하지 못하므로 isValid 값은 true로 머물러 있게 된다. 

stack이 비어있어 undefined상태이거나 sArr[j] !== obj[openBracket] 조건을 만족한다면 false로 바꾸어 준다.

 

마지막으로 cnt값을 카운트해야 하는데 true일 경우만 세어줘야 한다.

그렇다면 isValid가 true일 경우와 stack에 아무것도 없어야지 카운트를 할 수 있게 된다. 

stack배열에 아무것도 없는 경우의 조건을 포함시키지 않는다면 문제에서 제시한 테스트 케이스는 통과하지만 히든 케이스에서 막힐 가능성이 높다. 

true인 경우만 cnt 값을 카운트 해주기

 


리뷰

금방 쉽게 풀 수 있을 것 같은데 스택을 어떻게 구현해야할지 좀 막막했다.

스택 알고리즘을 사용하지 않았다면 엄청난 조건문이 나왔을 문제.,,,

 

오랜만에 다시 알고리즘 문제풀이를 시작했다.

남아 있는 문제들이 정답률 60%대로 진입하면서 너무 어려워졌다. 그래서 손이 가지 않았다...

하루에 한 문제씩이라도 풀어야겠다.