02
12

1. 문제 설명

 

코딩테스트 연습 - 올바른 괄호

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

programmers.co.kr

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

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

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

 

2. 제한 사항

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

 

3. 입출력 예제

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

 

3. 나의 접근 방식

  • s를 반으로 나누어서 열린 괄호와 닫침 괄호의 개수가 같다면 true일 것이다!라고 일차원적으로 생각했지만 실패.
  • 효율성이 떨어지며, 닫침 괄호로 시작하는 등의 경우를 생각하지 않았기 떄문에 예외 케이스가 있었다.
실패한 코드
function solution(s){
    // 열림 괄호와 닫침 괄호의 갯수를 계산한다.
    let open = 0;
    let close = 0;
    for(let i = 0; i < s.length; i++) {
        if(s[i] === "(") open++;
        if(s[i] === ")") close++;
    }
    
    if(open === close) return true;
    else return false;
}​
  • 그래서 시작이 닫침 괄호일 때는 절대로 true가 나올 수 없기 때문에 그 경우를 바로 false로 처리한 후에, 배열에 넣어서 스택처럼 열림 괄호가 나오면 배열에 넣고, 다시 닫침 괄호가 나오면 빼는 방식으로 모든 s를 돌아 검사한 후에, 그 스택에 요소가 들어 있으면 닫침과 열림의 수가 맞지 않다는 말이 되므로 false 아니면 true로 답을 낼 수 있었다.

 

4. 결과

function solution(s){
    let arr = [];
    if(s[0] === ")") return false;
    for(let i = 0; i < s.length; i++){
        if(s[i] === "(") arr.push(s[i])
        if(s[i] === ")") arr.pop();
    }
    if(arr.length === 0) return true;
    else return false;
}
COMMENT