1. λͺ¨λ Έν€ μ€ν(Monotone stack) μ΄λ?
μ€ν(Stack)μ νμͺ½ λμμλ§ λ°μ΄ν°λ₯Ό λ£κ³ λΊ μ μλ νμ μ μΆ(LIFO:Last In, First Out) ννμ μλ£κ΅¬μ‘° μ λλ€.
μ¦, κ°μ₯ λ¨Όμ λ€μ΄μ¨ λ°μ΄ν°κ° κ°μ₯ λ§μ§λ§μ λκ°κ³ , λ§μ§λ§μ λ€μ΄μ¨ λ°μ΄ν°κ° κ°μ₯ λ¨Όμ λκ°λ ꡬ쑰μ λλ€.
- λͺ¨λ
Έν€ μ€ν(Monotone stack)μ νΉμ ν μμλ₯Ό μ μ§νλ©΄μ λ°μ΄ν°λ₯Ό κ΄λ¦¬νλ μ€ν μλ£κ΅¬μ‘° μ
λλ€.
- Monotoneμ μ¦κ°νκ±°λ κ°μνλ λ±μ μΌμ ν κ²½ν₯μ΄ λ³΄μμ μλ―Έν©λλ€.
- λͺ¨λ Έν€ μ€ν(Monotone stack)μ μ¦κ°νκ±°λ κ°μνλ μΌμ ν κ²½ν₯μ κ°μ§ μ€νμ λλ€.
- λͺ¨λ
Έν€ μ€ν(Monotone stack)μ νΉμ λ¬Έμ μ λν΄ μκ° λ³΅μ‘λλ₯Ό O(N)μΌλ‘ μ€μ¬μ£Όλ λ§€μ° ν¨μ¨μ μΈ ν΄κ²°μ±
μ μ 곡ν©λλ€.
- λ€μ/μ΄μ λ°μ΄ν°μ μ΅λκ°/μ΅μκ°μ(Nearest Greater/Smaller Element) μ°Ύλ λ¬Έμ μ μ μ©νκ² μ°μ λλ€.
2. λͺ¨λ Έν€ μ€ν(Monotone stack)μ μ’ λ₯ λ° κ΅¬ν
μ€νμ LIFO(Last In, First Out) μλ£ κ΅¬μ‘°μ΄κΈ° λλ¬Έμ λͺ¨λ Έν€ μ€νμ μ΅μμ μμλ₯Ό μ κ±°νλ©΄μ λ¨μ‘° μ¦κ°/κ°μ μμλ₯Ό μ μ§ν©λλ€. μλ‘μ΄ μμλ νμ μ΅μμμ μΆκ°λ©λλ€.
1) λ¨μ‘° μ¦κ° μ€ν(Monotone Increasing Stack)
- μ€νμ μμλ€μ΄ μ€λ¦μ°¨μμΌλ‘ μ λ ¬λλ μ€ν
- μ€λ¦μ°¨μμ μ μ§νλ€λ κ²μ μ€νμ μλμͺ½λΆν° μμͺ½μΌλ‘ μ¬λΌκ°μλ‘ κ°μ΄ 컀μ§λ€λ μλ―Έ
- μ€νμ μ΅μμμμλΆν° μμνμ¬ μλλ‘ λ΄λ €κ°μλ‘ κ°μ΄ μμμ§
10 (top) |
5 |
2 |
1 |
- μ€νμ 맨 μμ μλ μμκ° νμ κ·Έ μλμ μλ μμλ³΄λ€ ν¬κ±°λ κ°μ κ²½μ°λ₯Ό μ μ§νλ μ€ν
- μ€νμ μλ‘μ΄ μμλ₯Ό μΆκ°ν λ, κ·Έ μμκ° μ€νμ μ΅μμ μμλ³΄λ€ μκ±°λ κ°μ λκΉμ§ κΈ°μ‘΄ μμλ₯Ό μ κ±°
- μ΄λ, λ¨μ‘°μ±μ μ μ§ν΄μΌν©λλ€. (μ€νμ μλ μμλ€μ΄ νμ νΉμ μμ(μ€λ¦μ°¨μ)λ₯Ό μ μ§)
- μ€λ³΅ κ° νμ© μ¬λΆμ λ°λΌ κ°μ΄ κ°μ κ²½μ°μ λν μ κ±° μ¬λΆλ₯Ό μ νλ©΄ λ©λλ€.
Deque<Integer> stack = new ArrayDeque<>();
for (int i=0; i<arr.length; i++) {
// μ€νμ μ΅μμ μμκ° νμ¬ κ°λ³΄λ€ ν¬κ±°λ κ°μΌλ©΄ pop();
while (!stack.isEmpty() && stack.peekFirst() >= arr[i]) {
stack.removeFirst();
}
// μ€νμ μ΅μμ μμλ³΄λ€ μμλκΉμ§ κΈ°μ‘΄ μμλ₯Ό μ κ±°νκ³ , νμ¬ μμ μ€νμ μΆκ°
stack.offerFirst(arr[i]);
}
2) λ¨μ‘° κ°μ μ€ν(Monotone Decreasing Stack)
- μ€νμ μμλ€μ΄ λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬λλ μ€ν
- λ΄λ¦Όμ°¨μμ μ μ§νλ€λ κ²μ μ€νμ μλμͺ½λΆν° μμͺ½μΌλ‘ μ¬λΌκ°μλ‘ κ°μ΄ μμμ§λ€λ μλ―Έ
- μ€νμ μ΅μμμμλΆν° μμνμ¬ μλλ‘ κ°μλ‘ κ°μ΄ 컀μ§
1 (top) |
2 |
5 |
10 |
- μ€νμ 맨 μμ μλ μμκ° νμ κ·Έ μλμ μλ μμλ³΄λ€ μκ±°λ κ°μ κ²½μ°λ₯Ό μ μ§νλ μ€ν
- μ€νμ μλ‘μ΄ μμλ₯Ό μΆκ°ν λ, κ·Έ μμκ° μ€νμ μ΅μμ μμλ³΄λ€ ν¬κ±°λ κ°μ λκΉμ§ κΈ°μ‘΄ μμλ₯Ό μ κ±°
- μ΄λ, λ¨μ‘°μ±μ μ μ§ν΄μΌν©λλ€. (μ€νμ μλ μμλ€μ΄ νΉμ μμ(λ΄λ¦Όμ°¨μ)λ₯Ό μ μ§)
- μ€λ³΅ κ° νμ© μ¬λΆμ λ°λΌ κ°μ΄ κ°μ κ²½μ°μ λν μ κ±° μ¬λΆλ₯Ό μ νλ©΄ λ©λλ€.
Deque<Integer> stack = new ArrayDeque<>();
for (int i=0; i<arr.length; i++) {
// μ€νμ μ΅μμ μμκ° νμ¬ κ°λ³΄λ€ μκ±°λ κ°μΌλ©΄ pop();
while (!stack.isEmpty() && stack.peekFirst() <= arr[i]) {
stack.removeFirst();
}
// μ€νμ μ΅μμ μμλ³΄λ€ ν΄ λκΉμ§ κΈ°μ‘΄ μμλ₯Ό μ κ±°νκ³ , νμ¬ μμ μ€νμ μΆκ°
stack.offerFirst(arr[i]);
}
3. λͺ¨λ Έν€ μ€ν(Monotone stack) ꡬν - μμλ‘ νμΈ
κ°μΈμ μΌλ‘ λͺ¨λ Έν€ μ€νμ μ’ λ₯μ λν΄ μ΄ν΄νλλ°μ μ‘°κΈ μκ°μ΄ κ±Έλ Έμ΅λλ€. λ¨μ‘° μ¦κ° μ€νκ³Ό λ¨μ‘° κ°μ μ€νμ μ λ ¬ μμκ° μ΄λλΆν° μμνλμ§μ λν μ νν μ΄ν΄λ₯Ό λͺ»νκ³ λ¬΄μμ μ΄ν΄νλ €κ³ νλ€λ³΄λ ν·κ°λ Έμ΅λλ€.
κ·Έλμ λ§μ§λ§μΌλ‘ λ°°μ΄ μμλ₯Ό μ 리νλ©΄μ μμ§μ μ‘°κΈ ν·κ°λ¦¬λ λΆλΆμ μ 리ν΄λ³΄κ² μ΅λλ€.
public static void main(String[] args) {
int[][] testArrays = {
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
{10, 9, 8, 7, 6, 5, 4, 3, 2, 1},
{5, 5, 4, 4, 3, 3, 2, 2, 1, 1},
{3, 6, 1, 9, 4, 7, 2, 8, 5, 10}
};
for (int[] arr : testArrays) {
System.out.println("Monotonic Stack for array: " + Arrays.toString(arr));
incresing(arr);
decresing(arr);
System.out.println();
}
}
ν μ€νΈ λ°°μ΄μ μμ κ°μ΄ 4κ°μ§ μ λλ‘ μμ±ν΄λκ³ λ¨μ‘° μ¦κ° μ€νκ³Ό λ¨μ‘° κ°μ μ€νμ μΆλ ₯ν΄λ³΄μμ΅λλ€.
*κ° μ€νμ 2λ² λͺ©μ°¨μ μ½λλ₯Ό μνν΄μ μμ±
μ μ½λμ λν μΆλ ₯ κ²°κ³Όλ μλμ κ°μ΅λλ€.
Monotonic Stack for array: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Monotonic Increasing Stack: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,
Monotonic Decreasing Stack: 10,
Monotonic Stack for array: [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
Monotonic Increasing Stack: 1,
Monotonic Decreasing Stack: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
Monotonic Stack for array: [5, 5, 4, 4, 3, 3, 2, 2, 1, 1]
Monotonic Increasing Stack: 1,
Monotonic Decreasing Stack: 1, 2, 3, 4, 5,
Monotonic Stack for array: [3, 6, 1, 9, 4, 7, 2, 8, 5, 10]
Monotonic Increasing Stack: 10, 5, 2, 1,
Monotonic Decreasing Stack: 10,
λ¨μ‘° μ¦κ° μ€νμ μμλ€μ΄ μ€λ¦μ°¨μ(μ€νμ μλλΆν° μ΅μμκΉμ§)μΌλ‘ μ λ ¬λμ΄ μλ μ€ν
λ¨μ‘° κ°μ μ€νμ μμλ€μ΄ λ΄λ¦Όμ°¨μ(μ€νμ μλλΆν° μ΅μμκΉμ§)μΌλ‘ μ λ ¬λμ΄ μλ μ€ν
μΈ μ μ 머리μμ κΌ λ΄μλκ³ μΆλ ₯ κ²°κ³Όλ₯Ό νμΈν΄λ³΄λ©΄, μ λλ‘ μΆλ ₯λλ κ²μ μ μ μμ΅λλ€.
μ½λ ꡬνμ μ€λ³΅ κ°μ νμ©νμ§ μμκΈ° λλ¬Έμ 3λ² μμμ²λΌ μ€λ³΅ κ°μ΄ μλ κ²μ νμΈν μ μμ΅λλ€.
λ§μ½ μ€λ³΅μ νμ©νλ€λ©΄ μλμ κ°μ κ²°κ³Όκ° μΆλ ₯λ©λλ€.
Monotonic Stack for array: [5, 5, 4, 4, 3, 3, 2, 2, 1, 1]
Monotonic Increasing Stack: 1, 1,
Monotonic Decreasing Stack: 1, 1, 2, 2, 3, 3, 4, 4, 5, 5,
λ¨μ‘° μ¦κ° μ€ν ν¨μλ μλμ κ°μλ λ§μ§λ§ μμμΈ {3, 6, 1, 9, 4, 7, 2, 8, 5, 10} μ λν λ¨μ‘° μ¦κ° μ€ν μμ± κ³Όμ μ ꡬ체μ μΌλ‘ λ³΄κ² μ΅λλ€.
public static void incresing(int[] arr) {
Deque<Integer> stack = new ArrayDeque<>();
for (int i=0; i<arr.length; i++) {
// μ€νμ μ΅μμ μμκ° νμ¬ κ°λ³΄λ€ ν¬κ±°λ κ°μΌλ©΄ pop();
while (!stack.isEmpty() && stack.peekFirst() >= arr[i]) {
stack.removeFirst();
}
// μ€νμ μ΅μμ μμλ³΄λ€ μμλκΉμ§ κΈ°μ‘΄ μμλ₯Ό μ κ±°νκ³ , νμ¬ μμ μ€νμ μΆκ°
stack.offerFirst(arr[i]);
}
}
- λ°°μ΄: {3, 6, 1, 9, 4, 7, 2, 8, 5, 10}
λ°°μ΄ μμ | μ€λͺ | μ€ν |
첫λ²μ§Έ μμ: 3 | μ€νμ΄ λΉμ΄μμΌλ―λ‘ μμ 3 μΆκ° | [3] |
λλ²μ§Έ μμ: 6 | μ€νμ 맨 μ μμ(3)κ° 6λ³΄λ€ μμΌλ―λ‘ 6μ μ€νμ μΆκ° | [6, 3] |
μΈλ²μ§Έ μμ: 1 | μ€νμ 맨 μ μμ(6)κ° 1λ³΄λ€ ν¬λ―λ‘, 6μ μ€νμμ μ κ±° | [3] |
μ€νμ 맨 μ μμ(3)κ° 1λ³΄λ€ ν¬λ―λ‘, 3μ μ€νμμ μ κ±° | [ ] | |
μ€νμ΄ λΉμμΌλ―λ‘ μμ 1 μΆκ° | [1] | |
λ€λ²μ§Έ μμ: 9 | μ€νμ 맨 μ μμ(1)κ° 9λ³΄λ€ μμΌλ―λ‘, 9λ₯Ό μ€νμ μΆκ° | [9, 1] |
λ€μ―λ²μ§Έ μμ: 4 | μ€νμ 맨 μ μμ(9)κ° 4λ³΄λ€ ν¬λ―λ‘, 9λ₯Ό μ€νμμ μ κ±° | [1] |
μ€νμ 맨 μ μμ(1)κ° 4λ³΄λ€ μμΌλ―λ‘, 4λ₯Ό μ€νμ μΆκ° | [4, 1] | |
μ¬μ―λ²μ§Έ μμ: 7 | μ€νμ 맨 μ μμ(4)κ° 7λ³΄λ€ μμΌλ―λ‘, 7μ μ€νμ μΆκ° | [7, 4, 1] |
μΌκ³±λ²μ§Έ μμ: 2 | μ€νμ 맨 μ μμ(7)κ° 2λ³΄λ€ ν¬λ―λ‘, 7μ μ€νμμ μ κ±° | [4, 1] |
μ€νμ 맨 μ μμ(4)κ° 2λ³΄λ€ ν¬λ―λ‘, 4λ₯Ό μ€νμμ μ κ±° | [1] | |
μ€νμ 맨 μ μμ(1)κ° 2λ³΄λ€ μμΌλ―λ‘, 2λ₯Ό μ€νμ μΆκ° | [2, 1] | |
μ¬λλ²μ§Έ μμ: 8 | μ€νμ 맨 μ μμ(2)κ° 8λ³΄λ€ μμΌλ―λ‘, 8μ μ€νμ μΆκ° | [8, 2, 1] |
μνλ²μ§Έ μμ: 5 | μ€νμ 맨 μ μμ(8)κ° 5λ³΄λ€ ν¬λ―λ‘, 8μ μ€νμμ μ κ±° | [2, 1] |
μ€νμ 맨 μ μμ(2)κ° 5λ³΄λ€ μμΌλ―λ‘, 5λ₯Ό μ€νμ μΆκ° | [5, 2, 1] | |
μ΄λ²μ§Έ μμ: 10 | μ€νμ 맨 μ μμ(5)κ° 10λ³΄λ€ μμΌλ―λ‘, 10μ μ€νμ μΆκ° | [10, 5, 2, 1] |
μ΅μ’ μ μΌλ‘ μ€νμ μΆλ ₯νλ©΄ [10, 5, 2, 1] μ΄ μΆλ ₯λ©λλ€.
μ€νμ 맨 μ μμκ° νμ¬ λ°°μ΄ μμλ³΄λ€ ν¬κ±°λ κ°μΌλ©΄ μ€νμμ μ κ±°νκ³ , νμ¬ μμλ₯Ό μ€νμ μΆκ°νλ©΄μ λ¨μ‘°μ±μ μ μ§ν μ μλ κ²μ λλ€.
4. λͺ¨λ Έν€ μ€ν(Monotone stack) κ΄λ ¨ λ¬Έμ
[λ°±μ€] ν 보기 - μλ°(Java)
λ¬Έμ λ§ν¬https://www.acmicpc.net/problem/22866λ¬Έμ μ€λͺ μΌμ§μ μΌλ‘ λ€μν λμ΄μ κ±΄λ¬Όμ΄ μ΄ Nκ°κ° μ‘΄μ¬νλ€. κ° κ±΄λ¬Ό μ₯μμμ μ μμ μ‘΄μ¬νλ 건물μ μμ λͺ κ° λ³Ό μ μλμ§ κΆκΈν΄μ‘λ€. iλ²μ§Έ 건
coding-vvon.tistory.com
μ°Έκ³ λ§ν¬
λͺ¨λ Έν€ μ€ν, ν,λ±μ κ΄νμ¬.
μλ‘ . μ€ν, ν, λ± λ¬Έμ λ€μ νΈλ λμ λ§μ μκ³ λ¦¬μ¦λ€μ΄ ν΄λΉ μκ³ λ¦¬μ¦μ μ¬μ©νλ κ²μ 보μλ€ νλκ°μ΄ ν΄λΉ νμμ λ°λ₯΄κ³ μλ κ²μ λ³΄κ³ λκ° μ ννλ μκ³ λ¦¬μ¦μ΄ μλ? μκ°μ΄ λ€μλ
velog.io
'π¬ Computer Science > Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μλ£κ΅¬μ‘°] νΈλΌμ΄(Trie) - Javaλ‘ κ΅¬ννλ 2κ°μ§ λ°©μ (1) | 2024.07.16 |
---|---|
[μλ£κ΅¬μ‘°] νΈλΌμ΄(Trie) (0) | 2024.05.08 |