알고리즘

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

BGK97 2025. 1. 9. 15:30

문제 설명

문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/12909

문제 설명

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

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

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

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

입출력 예 설명

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

 

풀이 방법

  • push, pop 메서드를 사용하지 않고 직접 idx를 관리해서 풀어봤다.
  • 스택을 이용해서, idx 기준으로 여는 괄호일 때는 push를, 아닐 때는 pop을 사용했다.
  • 작업 이후, idx가 0이면 쌍이 다 맞는것이니 true를, 아니면 false를 리턴하면 끝

예외 처리

  • 초기 값이 ')' 닫는 괄호이면 애초부터 옳지 않으므로 false를 리턴한다.
  • 이후 반복문 진행 과정에서도 다음 값이 닫는 괄호인데 idx가 0이라면 쌍이 맞지 않는 것이므로 false를 리턴한다.

풀이 코드

function solution(s){
    const array = s.split("");
    
    //닫는괄호부터 시작이면 바로 false
    if(array[0] === ')') return false;
    
    //스택으로 활용할 배열
    let stack = [];
    let idx = 0;
    
    array.forEach((e) => {
        //여는 괄호면 삽입
        if(e === '('){
            stack[idx++] = e;
        }
        else if(e === ')'){
            //길이가 0이라면 옳지않은 괄호이므로
            if(idx <= 0){
                return false;
            }
            else {
                //닫는 괄호면 idx 뒤로
                stack[--idx];
            }
        }
    })
    
    //반복문이 끝나고, stack의 idx가 0이면 옳은 괄호
    if(idx === 0) return true;
    else return false;
}

결과

회고

  • 스택을 오랫동안 안쓰다가 직접 구현하려하니 헷갈리는 부분이 있었다... 처음에는 shift를 쓰려다가 이러면 배열순환이 완벽하게 돌아가지 않기 때문에 스택을 이용했다.
  • 스택, 큐의 원리 및 구현 방법을 다시 공부해보고, Js에서 직접 구현해보면서 감을 익혀봐야할 것 같다.