[Programmers] 괄호 회전하기 - JavaScript

Joosi_Cool·2023년 2월 9일
0

Programmers

목록 보기
16/98
post-thumbnail

문제설명



설계 과정

  1. 회전시에 기준이 되는 점 변수 정하기 -> 이는 한번 할때마다 1씩 빼짐.
  2. 그 기준으로 뒤에 부분을 먼저 식에 대입, 앞에꺼를 그 다음에 대입
    -> 만약 값이 ( , { , [ 라면 stack에 push
    -> 값이 ) , } , ], 라면 stack에 있는걸 pop하여 각자 대상이랑 비교, 만약 짝이 안맞는다면 answer X
  3. 이렇게 끝까지 갔을때, stack에 남는게 없고 중간에 짝 안맞는게 걸리지 않았다면 answer++


풀이 코드

function solution(s) {
    var answer = 0;
    var len = s.length;
    
    while(true){
        var stack = [];
        var popChar;
        var check = true;
        for(var i = len; i<s.length;i++){
            if(s[i]==="\("||s[i]==="\{"||s[i]==="\["){
                stack.push(s[i]);
            }
            else{
                popChar = stack.pop();
                if(s[i]===")"){
                    if(popChar!=="("){
                        check= false;
                        break;
                    }
                }
                else  if(s[i]==="}"){
                    if(popChar!=="{"){
                        check= false;
                        break;
                    }
                }
                else  if(s[i]==="]"){
                    if(popChar!=="["){
                        check= false;
                        break;
                    }
                }
            }
        }
        
        for(var k = 0;k<len;k++){
            if(s[k]==="("||s[k]==="{"||s[k]==="["){
                stack.push(s[k]);
            }
            else{
                popChar = stack.pop();
                if(s[k]===")"){
                    if(popChar!=="("){
                        check= false;
                        break;
                    }
                }
                else  if(s[k]==="}"){
                    if(popChar!=="{"){
                        check= false;
                        break;
                    }
                }
                else  if(s[k]==="]"){
                    if(popChar!=="["){
                        check= false;
                        break;
                    }
                }
            }
            
        }
        if(check === true && stack.length===0) answer++;
        
        len--;
        if(len===0) return answer;
    }
}


결과

솔직히 이번 문제 위에 코드는 틀리거나 시간초과가 날 것이라고 예상했다. 왜냐하면 너무 문제에서 하란대로 풀었기 때문이다. 이 말이 무슨 말이냐면, 문제를 풀때 문제에서 하란대로 하기보단 그 문제를 관통하는 핵심적이고, 쉬운 풀이가 있기 마련이다. 하지만 이번 문제에서는 그걸 하기보다는 문제에서 하라는 순서대로 따라갔다. 그래서 코드가 엄청 길어졌고, 스스로 비효율적이라고 생각했다.
하지만 이 방법에 좋은 점은 틀린 논리는 아니라는 것이다. 문제에서 하란대로 했기 때문에 틀리지는 않았다. 혹시나 하는 마음에 다른 분들 코드도 참고했는데, 다른 분들도 이런식으로 진행하였고 이를 관통하는 핵심 풀이는 없는 것으로 보였다.

profile
집돌이 FE개발자의 노트

0개의 댓글