코딩테스트

[ 프로그래머스 ] javascript - 올바른 괄호

유기린 2022. 11. 11. 13:00

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

  • "()()" 또는 "(())()" 는 올바른 괄호입니다.
  • ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.


function solution(s){
    var answer = true;
    var s_pushed = [];

//시작이 ")" 일 때 false
    if( s[0] === ")" ){
        answer = false
    } 

//"("일 경우 변수에 추가하고 "("일 경우 변수에서 하나 삭제 
    for(let i=0; i<s.length; i++){
        if(s[i] === "("){
            s_pushed.push(s[i]);
        }else if(s[i] === ")"){
            s_pushed.pop();   
        }
    }

    if(s_pushed.length !== 0){
        answer = false
    } 
    
    return answer
    
    }

처음에는 이중 for문을 생각하고

첫 for문으로 ( 일경우에 두번째 for문을 돌려 ) 를 찾아서 push 하고 싶었는데 

for문이다보니까 두번째 for문에서 있는 ) 가 다 push 되었다. 

그래서 while를 써봐도 error가 나고 안됐다..

 

다른 블로그를 참고해서 위의 코드로 통과는 했지만

s = "()))" 일 경우는 false여야 하는데 결과로 ture가 나와버린다.

프로그래머스에서는 이 예시가 테스트에 없는지 통과 처리된다.

 

function solution(s){
    var answer = true;
    var s_pushed = 0;

//시작이 ")" 일 때 false
    if( s[0] === ")" ){
        answer = false
    } 

//"("일 경우 +1  "("일 경우 -1
    for(let i=0; i<s.length; i++){
        if(s[i] === "("){
            s_pushed += 1;
        }else if(s[i] === ")"){
            s_pushed -= 1;   
        }
    }

    if(s_pushed !== 0){
        answer = false
    } 

    return answer

    }

그래서 숫자로 +1 -1 로 처리했는데 

예제문제로는 결과가 잘 나오지만 테스트에서는 실패한다

문자열을 숫자로만 바꿨을 뿐인데 무슨 차이인지 모르겠다

 

 

 

참고 블로그

https://www.hyungjoo.me/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B4%84%ED%98%B8-%EC%A7%9D-%EB%A7%9E%EB%8A%94%EC%A7%80-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0-javascript/