๋ฌธ์ ํ์
O(1) ์๊ฐ ๋ณต์ก๋๋ก ํด๋น ๋ฉ์๋ ๋ค์ ๋์ํ ์ ์๋๋ก ๊ตฌํํด์ผํ๋ค.
ํ์ด
1๏ธโฃ Stack ํด๋์ค ์ด์ฉ
์ ๋ฌธ์ ์์, ๊ฐ์ฅ ์ค์ํ ๋ฉ์๋๋ getMin()
๋ฉ์๋์ด๋ค.
๋ค๋ฅธ, push()
, pop()
, top()
๋ฉ์๋๋ ๊ธฐ์กด Stack ํด๋์ค์์๋ O(1) ์ ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์, ์คํ์ ์์๋ฅผ ์ฝ์
ํ ๋, ์ต์๊ฐ์ ์ ์ฅํ๊ณ getMin()
๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ๋ฐ๋ก ๋ฐํํ ์ ์๋๋ก ํด์ผ O(1)์ ๋ง์กฑํ ์ ์์ ๊ฒ์ด๋ค.
์ต์๊ฐ์ ์ ์ฅํ๋ ์คํ์ ๋ฐ๋ก ์ถ๊ฐํด์, ๊ฐ์ push ํ ๋๋ง๋ค ํด๋น ์์น์ ์คํ ๊ฐ๊น์ง์ ์ต์๊ฐ์ ๊ธฐ๋กํ๋๋ก ๊ตฌํํ์๋ค.
import java.util.*;
class MinStack {
Stack<Integer> stack;
Stack<Integer> stackForMin;
public MinStack() {
stack = new Stack<>();
stackForMin = new Stack<>();
}
public void push(int val) {
stack.push(val);
if(stackForMin.isEmpty()){
stackForMin.push(val);
}else{
stackForMin.push(Math.min(val,stackForMin.peek()));
}
}
public void pop() {
stack.pop();
stackForMin.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return stackForMin.peek();
}
}
๊ฒฐ๊ณผ
2๏ธโฃ ๋ฐฐ์ด๊ณผ ํฌ์ธํฐ๋ฅผ ์ด์ฉํ ๋ฐฉ์
์๋ฐ์์ ์ ๊ณตํ๋ ์คํ ํด๋์ค๊ฐ ์๋ ๋ฐฐ์ด๊ณผ ํฌ์ธํฐ๋ฅผ ์ด์ฉํด์ ๊ตฌํํด๋ณด์๋ค.
์ต๋ 30000
๋ฒ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค๊ณ ํ์์ผ๋ฏ๋ก, ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ 30001
๋ก ์ค์ ํ ๋ค
push
, pop
์ ๋ฐ๋ผ pointer
๋ฅผ ๋ณ๊ฒฝ์์ผ์ฃผ๋ ๋ฐฉ์์ด๋ค.
์ต์๊ฐ์ ์ ์งํ๋ ๋ฐฉ๋ฒ์ 1๋ฒ ํ์ด์ ๋์ผํ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
class MinStack {
int[] stack;
int[] stackForMin;
int pointer = -1;
public MinStack() {
stack = new int[30001];
stackForMin = new int[30001];
}
public void push(int val) {
pointer++;
stack[pointer] = val;
if(pointer==0){
stackForMin[pointer] = val;
}else{
stackForMin[pointer] = Math.min(stackForMin[pointer-1],val);
}
}
public void pop() {
pointer--;
}
public int top() {
return stack[pointer];
}
public int getMin() {
return stackForMin[pointer];
}
}
๊ฒฐ๊ณผ
์คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ๋ฐฉ์๋ณด๋ค ๋ฎ์ ๋ฉ๋ชจ๋ฆฌ์ ๋น ๋ฅธ ์คํ ์๊ฐ์ด ๋์๋ค.
๐ ํ๊ณ
์คํ์์ ๊ฐ์ฅ ์ต์๊ฐ์ ๋ฐํํ๋ผ๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ผ๋ ๋ฌธ์ ๊ฐ ์์ ๊ฒ์ด๋ผ๊ณ ์์ํ์ง ๋ชปํ๋ค.
ํ์ง๋ง ์๊ณ ๋ฆฌ์ฆ ๊ฐ์ ๋, ๋ค์๋ ์์ด๋์ด๋ฅผ ๋ฐํ์ผ๋ก ์ฝ๊ฒ ๊ตฌํํ ์ ์์๋ค.