PS (Problem Solving)/Programmers

[프로그래머스] 괄호 회전하기 - 자바스크립트

캐럿노트 2024. 10. 15. 01:23

문제

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

 

프로그래머스

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

programmers.co.kr

 

자바스크립트

통과하지 못한 코드

처음에는 ()[]{}의 개수만 체크하는 로직으로 접근했었는데 14개 중 마지막 테스트 케이스를 통과하지 못했다.

// 통과하지 못한 잘못 접근한 코드

// 괄호가 모두 올바른지 체크하는 함수
function checkCorrect(bracketArr) {
    let checkBracket = [0, 0, 0] // Check Stack ["()","[]", {}]
    for (const bracket of bracketArr) {
        switch (bracket) {
            case "(":
                if (checkBracket[0] < 0) { 
                    // 이미 닫힌 괄호가 있었을 경우 올바른 문자열을 만들지 못하므로 false 반환
                    return false
                } else {
                    checkBracket[0] += 1
                }
                break;
            case ")":
                if (checkBracket[0] <= 0) { 
                    // 이전에 열린 괄호가 없었을 경우 false 반환
                    return false
                } else {
                    checkBracket[0] -= 1
                }
                break;
            case "[":
                if (checkBracket[1] < 0) {
                    return false
                } else {
                    checkBracket[1] += 1
                }
                break;
            case "]":
                if (checkBracket[1] <= 0) {
                    return false
                } else {
                    checkBracket[1] -= 1
                }
                break;
            case "{":
                if (checkBracket[2] < 0) {
                    return false
                } else {
                    checkBracket[2] += 1
                }
                break;
            case "}":
                if (checkBracket[2] <= 0) {
                    return false
                } else {
                    checkBracket[2] -= 1
                }
                break;
            default: 
                break;
        }
    }
    // 3개의 조건을 만족할 경우 true 반환
    return checkBracket[0] === 0 && checkBracket[1] === 0 && checkBracket[2] === 0 
}

function solution(s) {
    const n = s.length
    let brackets = [].concat(...s); // 배열로 깊은복사
   
    let answer = 0
    for (let i = 0; i < n; i++) { 
        if (i > 0) { // s를 0번째는 회전하지 않는다.
            brackets.push(brackets[0]) // 제일 처음 문자열을 뒤에 추가    
            brackets.shift() // 가장 앞 문자열을 제거한다
        }
        if (checkCorrect(brackets)) {
            answer += 1
        }
    }
     return answer;
}

 

통과한 코드

위 코드는 단순히 괄호의 순서 짝의 개수만 확인하기 때문에 [, {, ), ], }, ) 와 같은 순서가 다른 경우는 체크하지 못한다. 

순서도 지켜야 하기 때문에 stack 방식으로 접근법을 바꿔 해결했다.

// 괄호가 모두 올바른지 체크하는 함수
function checkCorrect(bracketArr) {
    let stack = [] 
    for (const bracket of bracketArr) {
        switch (bracket) {
            case "(":
                stack.push("(")
                break;
            case ")":
                if (stack[stack.length - 1] === "(") {
                    stack.pop();
                    break;
                } else {
                    return false;
                }
            case "[":
                stack.push("[")
                break;
            case "]":
                if (stack[stack.length - 1] === "[") {
                    stack.pop();
                    break;
                } else {
                    return false;
                }
            case "{":
                stack.push("{")
                break;
            case "}":
                if (stack[stack.length - 1] === "{") {
                    stack.pop();
                    break;
                } else {
                    return false;
                }
            default: 
                break;
        }
    }
    // stack이 비어있다면 true를 반환
    return stack.length === 0
}

function solution(s) {
    const n = s.length
    let brackets = [].concat(...s); // 배열로 깊은복사
   
    let answer = 0
    for (let i = 0; i < n; i++) { 
        if (i > 0) { // s를 0번째는 회전하지 않는다.
            brackets.push(brackets[0]) // 제일 처음 문자열을 뒤에 추가    
            brackets.shift() // 가장 앞 문자열을 제거한다
        }
        if (checkCorrect(brackets)) {
            answer += 1
        }
    }
     return answer;
}