코딩 테스트 풀이 🛠

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

엄성준 2023. 2. 22. 17:05

문제 설명

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

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

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

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

 

입출력 예

 


s answer
"()()" true
"(())()" true
")()(" false
"(()(" false

 

입출력 예 설명

 

입출력 예 #1,2,3,4
문제의 예시와 같습니다.

 

첫 번째 풀이

 

function solution(s){
    
    const stack =[]
    for(let i=0; i<s.length; i++){
        let str = s[i]
        switch(str){
            case '(':
                if(stack[stack.length-1] == ')') return false
                stack.push(str)
                break
            case ')':
                if(stack[stack.length-1] == '('){
                    stack.pop()
                }else{
                    return false
                }
        }
    }
    
    if(stack.length ===0){
        return true
    }else{
        return false
    }
}

위와 같이 풀이를 하니 아래와 같은 결과가 출력되었습니다.

 

실행 결과
정확성 테스트
 
테스트 1 통과 (0.06ms, 33.5MB)
테스트 2 통과 (0.05ms, 33.5MB)
테스트 3 통과 (0.05ms, 33.5MB)
테스트 4 통과 (0.07ms, 33.4MB)
테스트 5 통과 (0.06ms, 33.5MB)
테스트 6 통과 (0.08ms, 33.5MB)
테스트 7 통과 (0.08ms, 33.4MB)
테스트 8 통과 (0.06ms, 33.4MB)
테스트 9 통과 (0.15ms, 33.6MB)
테스트 10 통과 (0.05ms, 33.5MB)
테스트 11 통과 (0.06ms, 33.4MB)
테스트 12 통과 (0.17ms, 33.4MB)
테스트 13 통과 (0.25ms, 33.4MB)
테스트 14 통과 (0.17ms, 33.4MB)
테스트 15 통과 (0.14ms, 33.4MB)
테스트 16 통과 (0.23ms, 33.5MB)
테스트 17 통과 (0.16ms, 33.6MB)
테스트 18 통과 (0.16ms, 33.4MB)
효율성 테스트
 
테스트 1 통과 (6.09ms, 37.7MB)
테스트 2 실패 (시간 초과)
채점 결과
정확성: 69.5
효율성: 15.2
합계: 84.8 / 100.0
 

두번 째 풀이

 

function solution(s){
    let answer = 0; // 먼저 answer을 0으로 초기화해줍니다.

    for(let i=0; i<s.length; i++){ // 문자열 s를 순회
        s[i] === '('? answer+=1 : answer-=1 // s[i]번째 문자열이 '('와 같다면 answer에 1을 더하고 ')'라면 1을 뺍니다.
        
        if(answer <0) return false // 반복문을 도는 와중에 answer이 0보다 작다면 바로 falsereturn 합니다.
    }
    if(answer !==0) return false // 반복문이 종료된 후 answer을 값이 0이 아니라면 '('기호만 추가되서 양수이므로 falsereturn해줍니다.
    
    return true
    
}