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

재오·2023년 6월 7일
3

코딩테스트

목록 보기
35/46
post-thumbnail

🗒️ 문제

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

(), [], {} 는 모두 올바른 괄호 문자열입니다.
만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.

⚠ 제한사항

  • s의 길이는 1 이상 1,000 이하입니다.

📝 문제 해설

스택을 잘 활용할 줄만 안다면 그렇게 어려운 문제는 아니다. 우선 완전한 문자열이란 해당 문자열 안에서 짝을 이뤄야 한다. 내가 쓰고자 하는 것은 배열 메서드이기 때문에 우선 문자열을 배열로 바꿔주었다. 그리고 해당 짝을 쉽게 찾기 위해서 객체를 만들었다. 만약 왼쪽 쌍 괄호라면 무조건 스택에 순차적으로 넣어줄 것이고, 오른쪽이라면 우선 스택을 살펴본다. 해당 스택 마지막에 있는 원소값이랑 현재 살펴본 괄호가 한 쌍이라면 스택에 있는 마지막 값을 제거한다. 이걸 반복해서 스택의 길이가 0이라면 해당 문자열은 완전한 문자열이다.

그리고 스택을 초기화함과 동시에shift()push()를 사용함으로써 배열을 배열의 길이만큼 회전할 것이다.

💡 필요 문법

shift()

배열의 가장 앞에 있는 값을 제거하고 그 값을 반환한다.

push()

배열의 가장 끝에 원하는 값을 추가한다. 반환 값은 배열의 길이이다.

pop()

배열의 가장 끝에 위치한 값을 제거하고 그 값을 반환한다.

Spread Operator

[...s] 와 같이 문자열 s를 표현한다면 배열로 바꿔주는 연산자이다.

객체

객체의 value 값에 접근하기 위해서 대괄호 연산자를 사용한다.

💻 코드

function solution(s) {
    let stack = []; // 괄호의 짝을 찾기 위한 스택
    let string = [...s]; // 문자열을 배열로...
    let cnt = 0; // 올바른 괄호 문자열 개수

    let obj = {"{" : "}", "[" : "]", "(" : ")"}; // 스택에서 찾기 쉽게 괄호를 객체로 분리
    
    if(string.length%2 !== 0) return 0; // 문자열의 개수가 홀수라면 무조건 0을 반환
    
    for(let k=0; k<string.length; k++){
        for(let i=0; i<string.length; i++){
            if(string[i] === "[" || string[i] === "{" || string[i] === "("){
                stack.push(string[i]); // 왼쪽 괄호는 무조건 push 해준다
            }
            // 스택 마지막 원소와 문자열 괄호가 짝을 이룬다면 pop 해준다
            else if(string[i] === obj[stack[stack.length-1]]) stack.pop();
            else continue;
        }
        if(stack.length === 0) cnt++; // 스택의 길이가 0인 것은 올바른 괄호 문자열을 의미
        stack = []; // 다시 스택 초기화
        string.push(string.shift()); // 문자열 회전하기
    }
    return cnt; // 올바른 문자열 개수 반환
}
profile
블로그 이전했습니다

0개의 댓글