본문 바로가기
알고리즘/프로그래머스

[프로그래머스][자바스크립트][Level2] 짝지어 제거하기

by Benjamin_Choi 2021. 7. 20.

https://programmers.co.kr/learn/courses/30/lessons/12973

function solution(s)
{
    if (s.length % 2 === 1) return 0;
    
    var arr = s.split("");
    var answer = new Stack();
    for (let i = 0; i < s.length; i++) {
        if (answer.peek() === arr[i]) {
            answer.pop();
        } else {
            answer.push(arr[i]);
        }
        
        // 이 코드 없으면 2번째 효율성에서 막힘. 질문하기에서 참조함.
        if(arr.length - i < answer.length) return 0;
    }
    
    return answer.isEmpty() ? 1 : 0;
}

var Stack = (function() {
    function Stack() {
        this._element = [];
    }

    Stack.prototype.push = function(item) {
        this._element.push(item);
    }

    Stack.prototype.pop = function() {
        return this._element.pop();
    }

    Stack.prototype.peek = function() {
        return this._element[this._element.length - 1];
    }

    Stack.prototype.isEmpty = function() {
        return this._element.length === 0;
    }

    Stack.prototype.clear = function() {
        this._element = [];
    }

    Stack.prototype.size = function() {
        return this._element.length;
    }

    return Stack;
})();

처음에 splice 쓰니까 당연히 효율성 테스트 통과를 못했다.

 

그 다음엔 지금처럼 stack 하나 두고 arr 값도 빼서 넘기는 방식으로 확인하되 while (true) 로 처음부터 끝까지 매칭되는 값을 전부 확인하는 방식으로 처리했더니 마찬가지로 효율성 테스트 통과를 못했다. 

 

그래서 arr 값은 빼지 않고 stack에만 값을 추가하는 방식으로 처리해주니 2번 효율성 테스트 이외엔 통과했고 

 

마지막으로 stack에 남은 글자 갯수가 확인할 나머지 글자 보다 많을 경우 false로 끝내주는 코드를 넣어주니 최대 절반까지 연산이 줄어들면서 모두 통과했다.

댓글