[코테] 올바른 괄호 (스택/큐)

ekil·2026년 3월 30일

코딩테스트

목록 보기
6/15

올바른 괄호 (스택/큐)

2026.3.30.

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

핵심 개념

  • 후입선출의 스택 자료구조
  • 배열 속 요소를 활용할 필요성이 있는지 체크, 필요 없을 경우 개수만 카운트하도록 단순화 가능

내 풀이

function solution(s){
    const start = s.indexOf('(');
    if (start !== 0) {
        return false;
    }
    
    let answer = 0;
    
    for (let str of s) {
        answer = str === '(' ?  answer + 1 : answer - 1;
        if (answer < 0) {
            return false;
        }
    }
    
    if (answer !== 0) {
        return false;
    }
    
    return true;
}

개선된 풀이

function solution(s){
    let answer = 0;
    
    for (let str of s) {
        answer += str === '(' ? 1 : -1;
        if (answer < 0) {
            return false;
        }
    }
    
    return answer === 0 ? true : false;
}

핵심 차이

  • for 문 안에서 0 미만으로 떨어지면 바로 리턴하므로 기존의 얼리 리턴이 무의미함
  • 불필요한 if문을 없애고 삼항연산자 활용

막혔던 포인트

  • 스택 안에 괄호든 count든 쌓는다는 개념을 떠올리지 못하고, 스택 활용하는 건 맞는데 그걸 어떻게 로직으로 옮길지 방향을 잡지 못했음
  • 인덱스를 찾아서 배열을 slice하는 함수를 만들고 그걸 반복시켜야 하나.. 생각함 (지금까지 쌓인 '(' 개수와 ')'가 일치하지 않는 걸 체크하려는 시도. 근데 이제 로직이 명확하지 않은)

풀면서 찾은 개념

  • 인덱스 찾는다고 findIndex 메서드 썼는데 문법 오류가 났다! findIndex에서는 인자로 값이 아닌 함수를 받아야 하기 때문. (판별 함수를 만족하는 배열의 첫 번째 요소에 대한 인덱스를 반환함)
  • 내가 원했던 메서는 indexOf (값을 인자로 받음)
  • slice 메서드도 찾아봤다. start, end까지 자르되 end는 exclusive하게 자른 얕은 복사의 새 배열을 리턴

다음에 비슷한 문제 만나면

  1. 후입선출의 자료 구조가 필요한가?
  2. 배열에 담은 요소 자체를 활용하는가? -> 순회하며 요소 자체를 담고, 문제 요구사항을 체크
  3. 아니라면, 1 또는 -1을 더해주어 count 값을 이용해서 문제 요구사항을 체크하는 접근법을 떠올려보기
profile
좋아하는 일을 잘함으로써 먹고살고 싶은 프론트엔드 개발자입니다.

0개의 댓글