DEVELOP
article thumbnail

올바른 괄호 #12909

프로그래머스 알고리즘 고득점 Kit > 스택 / 큐 > level2 올바른 괄호

 

프로그래머스

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

programmers.co.kr

더보기

문제 설명

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

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

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

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

입출력 예sanswer
"()()" true
"(())()" true
")()(" false
"(()(" false
입출력 예 설명

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

나의 풀이

function solution(str) {
  const stack = [];
  
  for (const s of str) {
    if (s === "(") stack.push("(");
    else if (s === ")" && stack[stack.length - 1] === "(") stack.pop();
    else return false;
  }

  return stack.length === 0;
}
  • 스택 자료구조를 활용한다.
  • for문으로 str로 받은 괄호 문자열을 순회하면서,
    • ( 이면 무조건 스택에 푸시한다.
    • ) 이면서 가장 마지막 요소가 ( 라면 pop하여 괄호 쌍을 스택에서 상쇄시킨다. 
    • 이외의 경우에는 무조건 false를 반환한다.
      • 예를들어, 스택이 비어있거나,
      • 가장 마지막 요소가 ( 가 아닌 경우
    • 가 else 문에 해당되면, flase를 리턴한다.
  • 만약 괄호 쌍이 다 맞았다면 stack이 비어있을 것이다. 
  • 그러므로 stack의 길이가 0이먄 true를, 0이 아니면 false를 리턴한다. 

다른 풀이

function solution(str) {
  let bal = 0;

  for (const s of str) {
    bal += s === "(" ? 1 : -1;
    if (bal < 0) return false;
  }

  return bal === 0 ? true : false;
}
  • 변수 bal은 균형(balance)를 의미한다.
  • for문으로 str을 순회하면서,
    • ( 이면 bal에 1을 더하고, 
    • ) 이면 bal에 -1을 더한다. 
    • 만약 bal이 0이 되는 순간이 오면 닫는 괄호 )가 더 많다는 뜻이므로 false를 리턴한다.
  • for문 순회 후, 정상적으로 괄호의 균형이 맞았다면 0일 것이다.
  • bal 값이 0이면 true, 아니면 false를 반환한다. 

나의 풀이와 다른 풀이 결과 비교

profile

DEVELOP

@JUNGY00N