JavaScript/프로그래머스

[프로그래머스/JS] Lv1. 올바른 괄호 (스택 구현)

동구름이 2024. 6. 26. 20:25

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


풀이

스택을 구현하는 문제이다. 자바에서는 스택 라이브러리를 불러오면 끝인데, 자바스크립트는 직접 구현해야만 한다.

 

스택은 아래처럼 구현할 수 있다.

class Stack{
    constructor(){
        this.arr = [];
    }
    push(item){
        this.arr.push(item);
    }
    pop(){
        return this.arr.pop();
    }
    peek(){
        return this.arr[this.arr.length-1];
    }
    isEmpty(){
        return this.arr.length===0;
    }
}

 

이렇게 배열을 이용해서 배열메서드인 pop과 push를 이용해 쉽게 구현할 수 있다.

 

 

추가로, 자바에서도 Stack을 ArrayDeque를 통해 구현할 수 있는데, 그 때의 방식을 보면 index를 사용한다. 물론 head와 tail이라는 두 개의 인덱스를 사용하지만, 그것은 추후에 다룰, 큐에서 다루어보겠다.

 

 

 아래는 배열 메서드가 아닌, 인덱스를 통한 Stack 구현이다.

class Stack{
    constructor(){
        this.arr = [];
        this.index = 0;
    }
    push(item){
        this.arr[this.index++] = item;
    }
    pop(){
        if(this.index<=0) return null;
        return this.arr[--this.index];
    }
    peek(){
        return this.arr[this.index-1];
    }
    isEmpty(){
        return this.index===0;
    }
}

 

 

 

이전에 자바로 풀어본 문제였던터라, 스택 구현체를 구현해보는 것에 중점을 두었다. 

 

풀이를 설명하자면, "(" 가 오면 stack에 push한다. 그리고 ")"라면, peek()이 "("인지 확인하고, 맞다면 pop을 통해 스택의 "("를 빼낸다.

 

동작이 완료되고 stack이 비어있지않다면 올바르지 않은 괄호 형식이다.

 

 

 

아래는 전체 소스 코드이다.


function solution(s){
    var answer = true;
    
    let stack = new Stack();
    for(let i = 0; i<s.length;i++){
        let str = s.charAt(i)
        if(str==='('){
            stack.push(str);
        }
        else{
            if(stack.peek()=='(') stack.pop();
            else stack.push(str);
        }
    }
    if(stack.isEmpty()) answer = true;
    else answer = false;

    return answer;
}

class Stack{
    constructor(){
        this.arr = [];
        this.index = 0;
    }
    push(item){
        this.arr[this.index++] = item;
    }
    pop(){
        if(this.index<=0) return null;
        return this.arr[--this.index];
    }
    peek(){
        return this.arr[this.index-1];
    }
    isEmpty(){
        return this.index===0;
    }
}