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

Gaanii·2025년 5월 7일

Problem Solving

목록 보기
190/210
post-thumbnail

아래 프로그래머스 로고를 클릭하면 해당 문제로 이동합니다 😀

프로그래머스로고



풀이과정


이건 브루트포스라고 봐야하는건가 ... ?
각 회전마다 올바른 괄호 문자열인지 모두 체크를 해서 올바른 괄호 문자열이라면 카운트를 올려주면 된다.

괄호 검사는 isvalid(s) 를 통해 작성해줬다.
문자열에서 문자를 하나씩 뜯어서 검사하면 된다.

  • 뜯은 문자가 (, {, [면 스택에 넣기
  • 위 조건에 걸리지 않았을 때, 스택이 비어있거나 스택의 최상단이 현재 문자와 짝이 맞지 않는다면 올바르지 않은 괄호문자열로 판단
  • 그게 아니라면 스택에서 pop 연산 실행
    을 해주면 된다.

마지막에 stack이 비어있는지에 대한 True/False를 리턴해주면 된다.

코드


1. Python

def is_valid(s):
    stack = []
    bracket_map = {')': '(', ']': '[', '}': '{'}

    for ch in s:
        if ch in '([{':
            stack.append(ch)
        else:
            if not stack or stack[-1] != bracket_map[ch]:
                return False
            stack.pop()
    return not stack

def solution(s):
    count = 0
    n = len(s)

    for i in range(n):
        rotated = s[i:] + s[:i]
        if is_valid(rotated):
            count += 1

    return count

2. JS

const isValid = (s) => {
    let stack = [];
    const bracketMap = {')': '(', ']': '[', '}': '{'};
    
    for(const ch of s){
        if('([{'.includes(ch)) stack.push(ch)
        else {
            if(stack.length === 0 || stack[stack.length - 1] !== bracketMap[ch]) return false;
            stack.pop();
        }
    }
    return stack.length === 0;
}

function solution(s) {
    let cnt = 0;
    for(let i = 0 ; i < s.length ; i++){
        const rotated = s.slice(i) + s.slice(0, i);
        if(isValid(rotated)) cnt++;
    }
    return cnt;
}


결과


정답

0개의 댓글