Coding Test

[JS] 프로그래머스 코딩테스트 Lv. 2) 올바른 괄호

JustdoJustin 2022. 10. 27. 18:09
Test Explain

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

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

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

 

  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

 

My Answer (효율성 에러)

function solution(s){
  if(s[0]===')'){
    return false;
  }
  let balance=0;
  for(let i=0;i<s.length;i++){
    if(s[i]==='('){
      balance+=1; 
    }else{
      balance-=1;
      if(balance<0) return false;
    }
  }
  return balance===0 ? true : false;
}
  

console.log(solution(")()("))

초기값이 0인 변수를 만들어서 문자열의 배열을 돌면서 변수가 음수가 되면 false, 그리고 0일때만 true를 리턴하는 개념은 비슷한데, 채점을 하면 효율성을 문제로 지적한다.

 

Reference Answer

function solution(s){
    let cum = 0
    for (let paren of s) {
        cum += paren === '('? 1: -1
        if(cum < 0) {
            return false
        }
    }
    return cum === 0? true: false;
}

문제를 푸는 개념은 비슷하지만, 깔끔하게 코드를 작성한 느낌이다.

 

function solution(s){
 let answer = true;
    
 if(s.charAt(0) === ')' || s.charAt(s.length-1) === '(') answer = false; 

 const a = s.split('').filter((s) => s === '(').length;   
 const b = s.split('').filter((s) => s === ')').length; 
    
 if(a !== b) answer = false;
    
 let cntOpen = 0;
    
 for(let i = 0; i < s.length; i++) {
     if(s[i] === '(') cntOpen++;
     else cntOpen--;
        
     if(cntOpen < 0) answer = false;
 }
    
 return answer;
}

 문자열의 첫번째가 ) 이거나 마지막이 ( 이면 false

( 와 ) 갯수를 각각 세서, 서로 다르면 false

문자열을 돌면서 ( 면 + , ) 면 - 하다가 변수가 - 가 되면 false 

크게 3가지 조건을 각각 제시해주었다.

 

 

 

외부 참조 링크

https://jsikim1.tistory.com/251

 

프로그래머스 코딩테스트 연습 Level 2 - 올바른 괄호 (JavaScript)

프로그래머스 코딩테스트 연습 Level 2 - 올바른 괄호 (JavaScript) Programmers(프로그래머스)의 코딩테스트 연습문제 Level 2 중, [올바른 괄호] 문제를 JavaScript를 사용하여 해결해 보도록 하겠습니다.

jsikim1.tistory.com