괄호 회전하기 (level 2)

원용현·2022년 10월 21일
0

프로그래머스

목록 보기
31/49

링크

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

문제

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의한다.

(), [], {} 는 모두 올바른 괄호 문자열이다.
만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열이다.
예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열이다.
만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열이다.
예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열이다.

대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어진다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성하라.

문제 풀이

이 문제는 스택을 활용해서 풀이하면 어렵지 않게 구현할 수 있다.

스택을 활용하기 위한 배열을 하나 선언하고, 해당 배열에 대해서 값을 넣고 빼낼 때는 push와 pop만 사용하는 것으로 배열을 통해 스택을 사용할 수 있다.

  1. 여는 괄호
    스택에 넣는 push 작업을 진행한다.
  2. 닫는 괄호
    스택의 가장 상단에 쌓여있는 여는 괄호가 현재 닫는 괄호와 매치되는지 확인.
    매칭된다면 다음 괄호에 대해서 확인.
    매칭되지 않는다면 다음 회전에 대해서 판별 진행.
    모두 매칭된다면 반환값을 +1.

코드

function solution(s) {
    // 문자를 배열로 변환
    s = s.split('')
    // 
    let check = true
    let stack = []
    let result = 0
    
    // 최대 나올 수 있는 회전수만큼 반복문 진행
    for(let i = 0; i < s.length; i++) {
        for(const bracket of s) {
            // 여는 괄호일 경우에 스택에 저장
            // 닫는 괄호일 경우에 스택의 가장 위에 쌓인 괄호와 일치하는지 확인
            if(bracket === '(' || bracket == '{' || bracket === '[') {
                stack.push(bracket)
            } else if(bracket === ']') {
                if(stack[stack.length - 1] === '[') {
                    stack.pop()
                } else {
                    check = false
                    continue
                }
            } else if(bracket === '}') {
                if(stack[stack.length - 1] === '{') {
                    stack.pop()
                } else {
                    check = false
                    continue
                }
            } else if(bracket === ')') {
                if(stack[stack.length - 1] === '(') {
                    stack.pop()
                } else {
                    check = false
                    continue
                }
            }
        }
        
        // 문제 없이 반복이 완료되면 result++, 실패시 스택 초기화
        if(stack.length === 0 && check) result++
        else stack = []
        
        check = true
        // 회전을 진행
        s.push(s.shift())
    }
    
    return result
}

0개의 댓글