λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Problem Solving/Algorithm, Tips

[Leetcode] Min Stack

by 행뱁 2020. 6. 28.

155. Min Stack

 

문제 μš”μ•½:

push(), pop(), top(), getMin()을 μ§€μ›ν•˜λŠ” μŠ€νƒμ„ λ””μžμΈν•˜λΌ. getMin()은 μŠ€νƒ λ‚΄ μ΅œμ†Œ μ›μ†Œλ₯Ό λ°˜ν™˜ν•˜λ©° μƒμˆ˜ μ‹œκ°„μ— μ™„λ£Œλ˜μ–΄μ•Ό ν•œλ‹€.

 

생각 1:

getMin()을 μƒμˆ˜ μ‹œκ°„μ— ν•˜λŠ” 것이 포인트. push() ν•  λ•Œλ§ˆλ‹€ min을 μ—…λ°μ΄νŠΈ ν•˜λŠ” 것은 어렡지 μ•Šμ§€λ§Œ, min이 pop() 될 경우 μ§μ „μ˜ min κ°’μœΌλ‘œ roll back ν•΄μ•Όν•œλ‹€. ν•˜μ§€λ§Œ μ§μ „μ˜ min 값을 λ‹€ μ €μž₯ν•΄λ‘˜ μˆ˜κ°€ μ—†μœΌλ―€λ‘œ (벑터λ₯Ό μ΄μš©ν•΄ μ €μž₯ν•΄λ‘˜ μˆ˜λŠ” μžˆκ² μ§€λ§Œ μ˜λ―Έκ°€ μ—†λ‹€κ³  μƒκ°ν–ˆμŒ) κ·Έλƒ₯ 벑터 ν•˜λ‚˜μ™€ μ…‹ ν•˜λ‚˜λ₯Ό μ΄μš©ν•΄ ν•΄κ²°ν•΄μ•Όκ² λ‹€κ³  μƒκ°ν–ˆλ‹€.

 

생각 2:

벑터 ν•˜λ‚˜μ™€ μ…‹ ν•˜λ‚˜λ₯Ό λͺ¨λ‘ μ“°λŠ” 게 λΉ„νš¨μœ¨μ μ΄λΌλŠ” 생각이 λ“€μ–΄μ„œ μ•„λž˜μ™€ 같은 struct Nodeλ₯Ό λ§Œλ“€κ³  set<Node>λ₯Ό λ§Œλ“€μ–΄ ν•΄κ²°ν•΄μ•Όκ² λ‹€κ³  μƒκ°ν–ˆλ‹€.

struct Node {
    int val;
    Node* prev;
};

 

λŒ€λ°•μ μΈ 풀이 발견: leetcode.com/problems/min-stack/discuss/647178/CPP-with-one-stacklessintgreater

push() ν•  λ•Œ min이 μ—…λ°μ΄νŠΈλœλ‹€λ©΄ μ§μ „μ˜ min을 λ¨Όμ € pushν•œλ‹€. μŠ€νƒμ„ μ›μ†Œ μ €μž₯ μš©λ„λ‘œλ§Œ μ“°λŠ” 게 μ•„λ‹ˆλΌ, μ§μ „μ˜ min μ΄λΌλŠ” λ‹€λ₯Έ 정보λ₯Ό μ €μž₯ν•˜λŠ” μš©λ„λ‘œλ„ λ™μ‹œμ— μ‚¬μš©ν•˜λŠ” 것이닀. 그러면 ν˜„μž¬μ˜ min이 pop() λ˜λ”λΌλ„ push ν•΄λ‘μ—ˆλ˜ μ§μ „μ˜ min으둜 min을 roll back ν•  수 μžˆλ‹€. 결과적으둜 벑터 ν•˜λ‚˜λ§Œ μ‚¬μš©ν–ˆμœΌλ©° μ›μ†Œλ₯Ό λͺ¨λ‘ traverse ν•˜λŠ” μ½”λ“œλ„ μ—†λ‹€.

class MinStack {
public:
    /** initialize your data structure here. */
    MinStack() {
        
    }
    
    void push(int x) {
        if(x <= min){
            v.emplace_back(min);
            min = x;
        }
        v.emplace_back(x);
    }
    
    void pop() {
        if(top() == min){
            v.pop_back();
            min = v.back();
        }
        v.pop_back();
    }
    
    int top() {
        return v.back();
    }
    
    int getMin() {
        return min;
    }
    
private:
    vector<int> v;
    int min = INT_MAX;
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(x);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */

λŒ“κΈ€