js 프로그래머스 올바른 괄호

이명진·2022년 10월 7일
0

코드카타

목록 보기
49/69

문제요약

괄호가 여러개주어 지는데 짝이 맞는 괄호이면 true를 아니면 false를 나타내면된다.
괄호는 순서대로 짝이 맞아야 한다.

내가 푼 풀이.

결과적으로 문제를 풀지는 못했다. 문제를 풀었는데 효율성 테스트는 다 통과하지 못했다.

1차 풀이..

1차 풀이는 쉽게 생각하고 꽤 단순하게 문제를 풀었다.

function solution(s){
    let answer = true;
  	let trigger = true;
  	let splitS = s
    let cnt = s.length
    
  	while(trigger){
      	if(s[0]===')'){
          answer = false;
          break;
        }
      	if(!cnt){
          trigger=false;
          break;
        }
    
      	splitS = splitS.split('()').join('')
   	
        if(splitS!==''){
          trigger=true;
        	answer = false;
        }else{
         
          trigger=false;
          answer = true;
          break;
        }
      	cnt--
    }

    return answer;
}

Split 함수를 활용하였는데 () 괄호별로 나누어서 문제를 풀었다.
괄호별로 구분하였고 다시 join 으로 합쳤다.

괄호일경우 지워주고 아닐경우 join으로 문자로 변경해주도록 하는 코드였다.

결과는 정확도 부분에서 한번에 다 통과하길래 통과할줄 알았다.

하지만 결과는 효율성부분에서 틀렸다.

두번째 풀이

문제 분류가 스택과 큐이여서 스택과 큐로 안풀어서 틀렸나 하고 스택과 큐를 적용해보도록 문제를 풀었다.

function solution(s){
    let answer = true;
		let stack = [];
  	let arr = s.split('')
    let turn = arr.length;
  	if(s[0]===')'){
      return false
    }
  	for(let i=0; i<turn;i++){
      let que = arr.shift()
      if(que === '('){
        stack.push(que);
      }else{
        let idx = stack.findIndex(x=>x=='(')
        if(idx>=0){
            stack.splice(idx,1)
        }else{
        
          	stack.push(que)
        }
      
        console.log(idx,stack)
        
      }
      
    }
  console.log(stack)
    return !stack.length?true:false;
  
}

배열로 변경후 하나씩 앞에서부터 뺀후에 괄호를 맞춰주면 스택을 지워주도록 했다.
하지만 결과는 이번에도 마찬가지로 효율성 부분에서 틀렸다.

문제가 무엇일지 힌트를 보기위해서 질문하기를 둘러봐서 해결한 분들의 말을 듣고 코드를 수정했다.
괄호가 ) 일때 바로 리턴하면 된다는 분이 있어서 적용해봤는데도 결과는 같았다.

1차적으로 푼 코드와 정확성 부분 속도도 비슷했다.
결국 고민을하다가 해답을 찾게 되었다.

다른사람의 풀이 겸 해답.

function solution(s) {
  let opened = 0;
  for (const bracket of s) {
    if (bracket === "(") opened += 1;
    if (bracket === ")") opened -= 1;
    if (opened < 0) return false;
  }
  return opened === 0;
}

간결하게 문제를 풀었다. 배열로 구분해서 스택을 쌓아나가야 할필요가 없이
문자열 그대로 계산하여서 숫자를 쌓아나갔다.
스택과 큐라고 해서 너무 배열의 고정관념에 쌓여있었던게 문제가 아니었나 싶다.

해답은 아직 제출하지 않았다. 나중에 다시한번 풀어볼 생각이다.

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글