프로그래머스 | 올바른 괄호의 위치 찾기

chaen·2024년 2월 16일
post-thumbnail

📌 문제

계산 수식이 주어졌을 때, 같은 짝의 괄호 위치를 찾는 프로그램을 제작하시오. 입력은 계산 수식으로 주어지며, 괄호의 짝 별 위치를 [시작, 끝] 으로 찾아 2차원 배열 형태로 반환한다. 위치 시작 값은 0으로 시작하며, 하나라도 짝이 맞지 않을 경우 빈 배열을 반환한다.

입출력 예

expressionreturn
(a+b)[0, 4]
(a*(b+c)+d)[[3, 7],[0, 10]]
(a*(b+c)+d+(e)[]
(a*(b+c)+d)+e)[]
(a(b+c)+d)+(e(f+g))[[3, 7], [0, 10], [15, 19], [12, 20]]

✨ 해결 방법

마찬가지로 스택을 이용한다. 알파벳은 무시하고, 전과 같이 여는 괄호가 있다면 우선 스택에 넣고, 닫는 괄호가 있다면 유의한다.

만약 닫는 괄호가 나왔는데도 스택이 텅 비어있다면 이는 짝이 맞지 않는다는 의미이므로 빈 배열을 반환하고 종료한다. 짝이 맞는다면 result 를 반환한다.

result의 경우, for문을 돌면서 조건문을 만족할 때, stack.pop() 된 요소 (여는 괄호) 와, i 번째 요소를 함께 반환한다.

여기서 만약 pop 되지 않은 요소가 있다면 이는 역시 짝이 맞지 않는다는 의미이므로 빈 배열을 반환한다.

💻 solution 1

function answer(str) {
    const stack = [];
    let result = [];

    for(let i=0; i<str.length; i++){
        if (str[i] === '('){
            stack.push(i);
        } else if (str[i] === ')'){
            if (stack.length === 0){
                return [];
            }
            result.push([stack.pop(), i]);
        }
    }

    if (stack.length !== 0) result = [];
    return result;

}

result.push([stack.pop(), i]); 부분을 유의해야 한다.

0개의 댓글