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

ckxo·2023년 8월 17일
0

programmers

목록 보기
23/29

문제 설명

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

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

제한사항

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

입출력 예

sresult
"[](){}"3
"}]()[{"2
"[)(]"0
"}}}"0

입출력 예 설명

입출력 예 #1

다음 표는 "[](){}" 를 회전시킨 모습을 나타낸 것입니다.

xs를 왼쪽으로 x칸만큼 회전올바른 괄호 문자열?
0"[](){}"O
1"](){}["X
2"(){}[]"O
3"){}[]("X
4"{}[]()"O
5"}[](){"X

올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.

입출력 예 #2

다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.

xs를 왼쪽으로 x칸만큼 회전올바른 괄호 문자열?
0"}]()[{"X
1"]()[{}"X
2"()[{}]"O
3")[{}]("X
4"[{}]()"O
5"{}]()["X

올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.

입출력 예 #3

s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

입출력 예 #4

s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

풀이

(string).charCodeAt((index))를 사용하였다.

  • 문제 풀기 전, charCodeAt()사용을 위해 알아야 할 점
    필자의 경우, 문제를 풀며 인터넷을 찾아볼 순 없으니 아스키코드값을 알기 위해 Console.log를 사용해 값을 확인해주었다.
  • (, )의 아스키코드값은 40, 41
  • [,]의 아스키코드값은 91, 93
  • {,}의 아스키코드값은 123, 125

우선, s문자열을 배열brc 로 바꿔주기 위해 s.split("")을 사용했다.

이후 배열 brc의 길이만큼 반복문을 돌려준다.
반복문 내부에서 실행되는 것은 다음과 같다.
1. checking(brc)함수
2. brc의 0번째 인자를 pop()으로 꺼내주기
3. brc에서 꺼낸 인자를 push()로 맨 마지막에 넣어주기

checking함수에서 실행되는 것은 다음과 같다.
1. 임시 배열 t 초기화
2. t에 brc의 가장 첫 번째 인자의 아스키 코드 값 넣어주기.
3. brc의 1번째부터 마지막번째 인자 확인을 위한 반복문 실행
3-1. 만약 t의 마지막 인자값과 (brc[i]의 아스키코드값)-1 혹은 -2를 한 값이 같으면, t의 마지막 인자 pop()으로 꺼내주기.
3-2. 3-1실행을 못 했을 경우, t에 brc[i]의 아스키코드값을 push()로 넣어주기
4. 반복문 실행 완료 후 t의 길이가 0이라면 answer++후 true 리턴. t의 길이가 0이 아니라면 false리턴

function solution(s) {
    var answer = 0;
    var t = [];
    var temp = 0;
    var brc = s.split("");
    
    function checking(str){
        t = [];
        t.push(str[0].charCodeAt(0));
        for(let i=1; i<str.length; i++){
            if(t[t.length-1]==str[i].charCodeAt(0)-1 || t[t.length-1]==str[i].charCodeAt(0)-2){
                t.pop();
            }
            else{
                t.push(str[i].charCodeAt(0));
            }
        }
        
        if(t.length==0){
            answer++;
            return true;
        }
        return false;
    }
    
    
    for(let i=0; i<brc.length; i++){
        checking(brc);
        temp = brc.shift();
        brc.push(temp);
    }
    
    return answer;
}

사실 처음 코드를 작성한 뒤 실행했는데 계속 테스트케이스 통과를 못해서 의아했다.
console.log로 반복문 중간중간 출력을 해서 보았는데도 테스트케이스를 왜 통과하지 못하는지 몰랐다.
알고보니 answer의 초기값이 -1로 되어있어서 0으로 고쳐주었다.
실제 문제 풀이 상황이었으면 많이 당황했을 것 같다.

0개의 댓글