본문 바로가기
자료구조&알고리즘/코딩테스트 문제연습

프로그래머스 Lv.2 올바른 괄호 (스택/큐) (JavaScript)

by 복숭아 우유씨 2022. 9. 18.

자바스크립트로 프로그래머스 문제 풀기

문제

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

괄호의 짝이 올바르게 지어졌는지 확인하는 문제로, 스택/큐 관련 문제이다.

풀이

나의 풀이

function solution(s){
	var answer = true;
	let tmp = []; //임시배열 생성
	let mark1 = 0, mark2 = 0; //'(' 수와 ')' 수를 카운팅
    
    if(s.length % 2 != 0) answer = false; //길이가 홀수이면 무조건 false
    
    for(let i = 0; i < s.length; i++) {
        if(s[i] == '(') {
            tmp.push(s[i]); //'(' 는 무조건 tmp에 push할 수 있다.
            mark1++; // '(' 카운팅
        }
        else { // ')' 인 경우,
            if(tmp[tmp.length - 1] == '(') tmp.pop() //앞이 '('로 ()짝이 맞으면 배열에서 빼낸다.
            else { 
                if(mark1 > mark2) { //배열 마지막이 ')'인데, '('수가 더 많으면 ')'를 배열에 넣는다.
                    tmp.push(s[i]);
                    mark2++;
                }
            }
            if(mark1 == mark2) tmp = []; //두 수가 같으면 짝이 맞는 것이므로 배열을 초기화한다.
        }
        
    }
    if(tmp.length) answer = false; //배열에 요소가 존재한다면 짝이 안맞는 것이다.

    return answer;
}

스택/큐 관련 문제라고 해서 최대한 스택을 사용해보려고 했다. 자바스크립트는 배열을 사용하면 간단하므로 임시 배열을 만들었다.

()의 짝이 맞으려면 문자열은 짝수의 길이를 가져야 하며, 짝이 맞으면 임시 배열을 초기화해서 확인하는 식으로 구현했다.

문자열 길이를 먼저 확인하는 것은 효율성을 확보하는데도 용이하다.

 

다른 사람들 풀이

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

다른 사람들 풀이중에 인상깊었던 풀이이다.

cum = 0 으로 두고, 순회하면서  ) 로 시작하면 음수가 되고, ()의 짝이 안맞아도 음수가 되는 점을 이용하여 간단하게 풀이한 점이 인상깊었다. 

 
 
 
 
 
 

댓글