balanceBrackets_ stack

mingyu Lim·2023년 3월 9일

코딩테스트

목록 보기
10/32

문제 설명

소괄호,중괄호,대괄호로 이루어진 문자열을 받아 모든 괄호의 짝이 맞는지의 여부를 리턴

제한사항

  • 괄호는 먼저 열리고([), 열린만큼만 닫혀야(]) 합니다.
  • 빈 문자열을 입력받은 경우, true를 리턴해야 합니다.

테스트 케이스

strresult
'[[[{{{((()))}}}]]]'true
'{}'true
'[(]{)}'false
'[]}{()'false
'('false
')('false

코드

의사 코드

프로그래머스의 올바른 괄호(,)만 이루어진 문자열이기 때문에 간단히 count을 이용해 열린 괄호와 닫힌 괄호를 +,-만 해주면 되었지만 이 문제의 경우{},[],() 3가지 전부 사용하기 때문에 괄호의 종류괄호의 짝이 맞는지 파악을 해주어야 한다.
1. {,[,( 이 3가지에 맞는 닫힌 괄호를 지정해준다.
2. 스택을 이용해서 괄호의 짝이 맞는지 또, 닫힌 괄호가 스택에 들어왔을때 닫힌 괄호, 열린 괄호의 짝이 맞는지 또, 종류가 맞는지 파악을 해준다.
3. 반복문을 사용하기 때문에 쉽게 걸러낼 수 있는 케이스는 반복문이 시작되기 전에 걸러내어 시간을 단축시킨다.

// sub 함수
const stackfunc = (stack, right) => {
  let left =''
  switch(right){
    case ')' : 
    left = '('
    break;
    case ']' : 
    left = '['
    break;
    case '}' : 
    left = '{'
    break;
  }
  stack.pop()
  return (stack[stack.length-1] === left) ? stack.pop() : false
}

//  main 함수
const balancedBrackets = function (str) {
  let stack = []
  if(str[0] === ')' || str[0] === '}' || str[0] === ']' || str.length %2 !== 0) return false

  for(let i of str){
    stack.push(i)
    if( i === ']' || i === '}' || i=== ')' ){
      if(stackfunc(stack,i) === false) return false
    }
  }
  return true
};

코드 설명

  1. balancedBrackets 함수에서 닫힌 괄호로 시작하거나, 들어온 문자열의 길이가 짝수가 아닐 경우 올바른 괄호가 아니기 때문에 false를 리턴해준다.
  2. 반복문을 통해 열린 괄호는 스택에 넣어주고 만일 닫힌 괄호 일 때 스택에 넣어준 후, stackfunc에 넘겨 준다.
  3. stackfunc는 스택에 있는 마지막 요소(닫힌 괄호)와 그 전의 요소(열린 괄호)가 짝이 맞는지 파악을 해주는 함수이다. 먼저 switch문을 통해 마지막 요소right와 맞는 종류의 열린 괄호를 left로 지정해준다.
  4. pop()을 통해 마지막 요소(닫힌 괄호)를 제거해주고, 스택에 마지막 요소가 left와 맞는지 확인하고 맞으면 스택에 마지막 값을 제거하고, 아니면 false를 리턴해준다.
  5. 다시 반복문으로 돌아와 만일 stackfunc의 값이 false를 리턴해주면 바로false를 리턴해준다.
  6. 반복문이 끝나면 올바른 괄호의 문자열이기 때문에 true를 리턴해준다.

0개의 댓글