[LeetCode | Javascript] Min Stack

박기영·2023년 8월 24일

LeetCode

목록 보기
12/41

solution

var MinStack = function() {
    this.stack = [];
};

/** 
 * @param {number} val
 * @return {void}
 */
MinStack.prototype.push = function(val) {
    this.stack.push(val);
};

/**
 * @return {void}
 */
MinStack.prototype.pop = function() {
    this.stack.pop();
};

/**
 * @return {number}
 */
MinStack.prototype.top = function() {
    return this.stack[this.stack.length - 1];
};

/**
 * @return {number}
 */
MinStack.prototype.getMin = function() {
  return Math.min(...this.stack);
};

/** 
 * Your MinStack object will be instantiated and called as such:
 * var obj = new MinStack()
 * obj.push(val)
 * obj.pop()
 * var param_3 = obj.top()
 * var param_4 = obj.getMin()
 */

자료 구조인 stack을 구현하는 문제이다.
그렇다보니 사실 크게 어려운 것이 없다.
아무래도 문제 자체가 알고리즘 지식을 요구하기보다는 자료 구조 자체에 대한 이해를 보는 느낌이라서
다른 분들도 답이 비슷했다.
다만, 최소값을 구하는 방법이 신기한 분이 계서서 소개를 하고자 한다.

다른 분의 solution

var MinStack = function() {
  this.elements = [];
};

/**

 @param {number} x
 @return {void}
 */
MinStack.prototype.push = function(x) {
  this.elements.push({
    value: x,
    min: this.elements.length === 0 ? x : Math.min(x, this.getMin()),
  });
};
/**

 @return {void}
 */
MinStack.prototype.pop = function() {
  this.elements.pop();
};
/**

 @return {number}
 */
MinStack.prototype.top = function() {
  return this.elements[this.elements.length - 1].value;
};
/**

 @return {number}
 */
MinStack.prototype.getMin = function() {
  return this.elements[this.elements.length - 1].min;
};

다른건 다 같은데 push 메서드를 구현하는데 있어서 최소값을 바로 구해서 넣어버리시는 것을 보았다.
이런 식으로 들어오는 값과, 그 당시의 최소값을 같이 저장해서 최소값 연산의 시간을 줄이는 것 같은데,
필자는 이 해결법이 유의미한 차이를 만들어내는지 궁금하다.
min 값을 계산할 때, getMin()을 호출하는 것이 나중에 한번 호출하는 것과 비교했을 때 차이를 만들어 낼까?

결과는..그렇다.

왜냐하면 필자가 스프레드 연산자를 사용해서 배열의 최소값을 탐색했기 때문이다.
이 분이 사용한 방법은 push 발생 시, min을 계산해 놓는 것으로 배열이 아니라,
이전 값과 비교를 하기 때문에 훨씬 빨랐던 것이다.

배열의 탐색이 얼마나 오래 걸리는지 체감할 수 있는 부분이다.

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글