โถ ์ ํ
- ๋ชจ๋ ธํค ์คํ์ ์คํ์ ์์๋ค์ด ํญ์ ๋จ์กฐ ์ฆ๊ฐํ๊ฑฐ๋ ๋จ์กฐ ๊ฐ์ํ๋๋ก ์ ์ง๋๋ ํน๋ณํ ํํ์ ์๋ฃ๊ตฌ์กฐ๋ค. ๊ทธ๋์ ๋จ์กฐ ์คํ์ด๋ผ๊ณ ๋ ํ๋ค.
- ๋ชจ๋ ธํค ์คํ์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ํน์ ํ ํจํด์ ๊ฐ์ง ๋ค์/์ด์ ์์๋ฅผ ์ฐพ๋ ๋ฌธ์ ๋ฅผ ์ ํ ์๊ฐ์ ํด๊ฒฐํ ์ ์๋ค๋ ์ ์ธ๋ฐ, ๊ฐ ์์๋ ์ต๋ ํ ๋ฒ์ฉ๋ง ์คํ์ ๋ค์ด๊ฐ๊ณ ๋์ค๊ธฐ ๋๋ฌธ์ O(n^2)์ด ๋ ์ฝ๋๊ฐ O(n)์ผ๋ก ์ ์ง๋๋ค., ์ด๊ฒ ์์ฒญ ํฐ ์ฅ์ ์ด๋ค.
- ๋ฐฐ์ด์์ ๊ฐ ์์์ ๋ค์์ผ๋ก ํฐ ์ ์ฐพ๊ธฐ, ํ์คํ ๊ทธ๋จ์์ ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ ๋์ด ๊ตฌํ๊ธฐ, ์จ๋๊ฐ ๋ ๋์์ง๋ ๋ ๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ ์ผ์ ๊ณ์ฐํ๊ธฐ ๊ฐ์ ์ ํ์ ์ ์ฉํ ์ ์๋ค.
flowchart TD
Start([์์]) --> Init[์คํ ์ด๊ธฐํ]
Init --> InputCheck{์๋ก์ด ์์๊ฐ<br>์๋๊ฐ?}
InputCheck -->|Yes| StackEmpty{์คํ์ด<br>๋น์ด์๋๊ฐ?}
InputCheck -->|No| End([์ข
๋ฃ])
StackEmpty -->|Yes| PushElement[์คํ์ ์์ ์ถ๊ฐ]
StackEmpty -->|No| CompareTop{์คํ top๊ณผ ๋น๊ต}
CompareTop -->|์กฐ๊ฑด ์๋ฐฐ| PopElement[์คํ์์<br>top ์์ ์ ๊ฑฐ]
CompareTop -->|์กฐ๊ฑด ๋ง์กฑ| PushElement
PopElement --> ProcessPopped[์ ๊ฑฐ๋ ์์๋ก<br>๊ฒฐ๊ณผ๊ฐ ๊ณ์ฐ]
ProcessPopped --> CompareTop
PushElement --> InputCheck
โถ ์ ๋ต
์ค๋ฆ์ฐจ์์ด๋ฉด ๋ค์ด๊ฐ๋ ค๋ ์๊ฐ top ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ pop์ ๋ฐ๋ณตํ๊ณ ๋ด๋ฆผ์ฐจ์์ด๋ฉด ๋ค์ด๊ฐ๋ ค๋ ์๊ฐ top ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ pop์ ๋ฐ๋ณตํ๋ฉด ๊ตฌํ๋๋ค.
[2, 1, 4, 3, 5]๋ฅผ ์๋ก ๋ค์ด๋ณด๊ฒ ๋ค.
๋จผ์ 2๊ฐ ๋ค์ด์จ๋ค. ๊ทธ ๋ค์ 1์ด ๋ค์ด์ค๋๋ฐ, 1์ 2๋ณด๋ค ์์ผ๋ฏ๋ก 2๋ฅผ popํ๊ณ 1์ pushํ๋ค. push ์ ์ top๊ณผ ๋น๊ตํ๋ ๊ฒ ํต์ฌ์ด๋ค.
4๋ 1๋ณด๋ค ํฌ๋ฏ๋ก ๊ทธ๋๋ก pushํ๊ณ , 3์ด ๋ค์ด์์ผ๋๋๋ฐ 3์ 4๋ณด๋ค ์์ผ๋๊น 4์ pop ํ๊ณ 3์ pushํ๋ค. ์ด๋ฐ์์ผ๋ก ์งํ์ด ๋๋๋ฐ, ๋ง์ฝ ์ ๋ ฅ ๋ฐฐ์ด์ด [2, 3, 5, 1] ์ด๋ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
5๊น์ง ๋ด์์ ๋ 1๊ณผ ๋น๊ตํ๋ฉด 5๊ฐ pop๋์ผํ๋ค. ์ฌ์ ํ top์ด 1๋ณด๋ค ํฌ๋ฏ๋ก 3๋ pop, 2๋ popํ๋ฉด ์คํ์ด ๋น ์ํ๋ก 1์ด push ๋๋ ๊ฒ์ด๋ค.
์ฆ ์คํ์ ์ด๋ค ๊ฐ์ ๋ฃ๊ธฐ ์ ์ k ์ด์์ ์๋ฅผ ๋ชจ๋ ์ ๊ฑฐํ๊ณ k๋ฅผ ๋ฃ๋ ๊ฒ์ด๋ค.
https://www.acmicpc.net/problem/1725
์๋ฅผ ํ๋ฒ ํ์ด๋ณด์.
for (int i = 1; i <= n; i++) {
// ํ์ฌ ๋ง๋(arr[i])๋ณด๋ค ํฐ ๋์ด์ ๋ง๋๋ค์ ์ฒ๋ฆฌ
while (!st1.isEmpty()) {
if (st1.peek() > arr[i]) {
long nowVal = st1.pop(); // ํ์ฌ ์ฒ๋ฆฌํ ๋์ด
st2.pop(); // ํด๋น ๋์ด์ ์์น๋ ํจ๊ป ์ ๊ฑฐ
// ์ง์ฌ๊ฐํ์ ์ผ์ชฝ ๊ฒฝ๊ณ ์ฐพ๊ธฐ
int leftIdx = -1;
if (st2.isEmpty())
leftIdx = 1; // ์คํ์ด ๋น์๋ค๋ฉด ์ฒ์๋ถํฐ
else
leftIdx = st2.peek() + 1; // ์ด์ ๋ง๋ ๋ค์ ์์น๋ถํฐ
// ์ง์ฌ๊ฐํ์ ์ค๋ฅธ์ชฝ ๊ฒฝ๊ณ๋ ํ์ฌ ์์น ์ง์ ๊น์ง
int rightIdx = i - 1;
// ๋์ด ๊ณ์ฐ
long width = rightIdx - leftIdx + 1;
long area = width * nowVal;
max = Math.max(max, area);
} else {
break; // ํ์ฌ ๋ง๋๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๋์ด๋ฅผ ๋ง๋๋ฉด ์ค๋จ
}
}
// ํ์ฌ ๋ง๋์ ์ ๋ณด๋ฅผ ์คํ์ ์ถ๊ฐ
st1.push(arr[i]);
st2.push(i);
}
๋ฉ์ธ ๋ก์ง์ด๋ค.
์ ๋ ฅ ๊ฐ๊ณผ top์ ๋น๊ตํ๋๋ฐ, top์ด ๋ ํฌ๋ฉด popํ๊ณ , idx๋ฅผ ๋ค๊ณ ์๋ ์คํ๋ popํ๋ค.(๋๊ธฐํ)
์ง๊ธ ์คํ์ ๋ค์ด์๋ ๊ฐ์ด ์ง์ฌ๊ฐํ์ ๋์ด๊ฐ ๋ ๊ฒ์ด๊ณ , ์ธ๋ฑ์ค์ ์ฐจ์ด๋งํผ์ด ๋๋น๊ฐ ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋์ pop๋๋ ์์ ์ ๋ฐ๋ก ์ด์ ์ธ๋ฑ์ค๊ฐ top์ด ์ ์ง๋๊ณ ์๋ ์ธ๋ฑ์ค์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฑธ ๋๋น๋ก ๊ณ์ฐํ๋ฉด ๋๋๋ค. ๋ฌผ๋ก ์ด ์์ ํ์, ์์ง ์คํ์ด ๋น์ด์์ง ์์ ์ ์๊ธฐ ๋๋ฌธ์ ์คํ์ ๋น์์ฃผ๋ ์์ ๋ ํ์๋ค. ๊ทผ๋ฐ ์ด๋ฏธ ํ์์ ๋ชจ๋ ํ ์์ ์ด๊ธฐ ๋๋ฌธ์, ์ค๋ฅธ์ชฝ ๋์ n์ผ๋ก ์ก๊ณ ์์ํ๋ค.
// ๋จ์ ์คํ ์ ๋ฆฌ
while (!st1.isEmpty()) {
Long nowVal = st1.pop();
st2.pop();
int rightIdx = n; // ์ค๋ฅธ์ชฝ ๋
int leftIdx = -1;
if (st2.isEmpty()) {
leftIdx = 1;
} else {
leftIdx = st2.peek() + 1;
}
long width = rightIdx - leftIdx + 1;
long area = width * nowVal;
max = Math.max(max, area);
}
์ด ๋ฌธ์ ๋ ๋จ์กฐ ์ฆ๊ฐ๋ก ํด๊ฒฐํ์ง๋ง, ์ด๋ป๊ฒ ๋ฌธ์ ์์ ๋จ์กฐ ์ฆ๊ฐ, ๊ฐ์๋ฅผ ํ์ ํ ์ ์์๊น?
๋จ์กฐ์ฆ๊ฐ์ ๋จ์กฐ๊ฐ์๋ฅผ ๊ตฌ๋ถํ๋ ํต์ฌ์ "์๊ตฌ์ฌํญ"์ ๋ฌ๋ ค์๋ค.
๋จผ์ ๊ฒฐ๊ณผ๊ฐ์ ์กฐ๊ฑด์ ํ์
ํด์ผํ๋ค. ์ฐพ๋ ๊ฐ์ด "๋ ํฐ ์"์ธ์ง "๋ ์์ ์" ์ธ์ง ๊ตฌ๋ถํด์ผ๋๋ค.
- "๋ ํฐ ์"๋ฅผ ์ฐพ๋ ๊ฒฝ์ฐ → ๋จ์กฐ๊ฐ์ ์คํ ์ ์ง
- "๋ ์์ ์"๋ฅผ ์ฐพ๋ ๊ฒฝ์ฐ → ๋จ์กฐ์ฆ๊ฐ ์คํ ์ ์ง
์ด๋ ๊ฒ ๋๋ ์ ์๋๋ฐ,
https://www.acmicpc.net/problem/2493
ํ ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด, ์ด์ ์คํ์ ๋ ํฐ ์๊ฐ ์์ ๊ธฐ๋ฅ์ด๋ค. ๊ทธ๋์ ๋จ์กฐ๊ฐ์ ์คํ์ ์ ์งํ๋ ๊ฒ์ด๋ค.
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main {
public static int[] input;
public static ArrayDeque<Integer> stack;
public static ArrayDeque<Integer> idx; // idx
public static int n;
public static int[] res;
public static void main(String[] args) throws Exception {
// System.setIn(new FileInputStream("res/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
n = Integer.parseInt(br.readLine());
input = new int[n + 1];
res = new int[n + 1]; // idx ๋ฒ ๊ธฐ๋ฅ์ด ์์ ํ์์ ๊ธฐ๋กํ๋ ค๊ณ
// idx ๊ณ์ฐ 1๋ถํฐ
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for (int i = 1; i <= n; i++) {
input[i] = Integer.parseInt(st.nextToken());
}
// ์
๋ ฅ ๋
stack = new ArrayDeque<>();
idx = new ArrayDeque<>();
go();
for (int i=1; i<=n; i++){
sb.append(res[i]).append(" ");
}
System.out.println(sb);
}
public static void go() {
for (int i = 1; i <= n; i++) {
// ๋จ์กฐ ๊ฐ์ ์คํ์ผ๋ก ๊ฐ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
int now = input[i];
while (!stack.isEmpty()) {
if (stack.peek() < now) { // top์ด ๋ ์์ผ๋ฉด ๋นผ์ผ๋๋ค
stack.pop();
idx.pop();
} else {
// ๊ทธ๊ฒ ์๋๋ผ๋ฉด ์์ ํ ๊ฒ
res[i] = idx.peek();
break;
}
}
stack.push(now);
idx.push(i);
}
}
}
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์!
'OJ๐ผ > ์๊ณ ๋ฆฌ์ฆ ์ ํ ์ ๋ฆฌ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋งจํดํผ ๊ฑฐ๋ฆฌ๊ฐ ์ต์๊ฐ ๋๋ ์ง์ ์ฐพ๊ธฐ (0) | 2025.01.08 |
---|---|
โ๏ธ์ด์งํ์ - BinarySearch(feat. ํ๋ผ๋ฉํธ๋ฆญ ์์น) (0) | 2024.07.16 |
์ ๋ ฌ - Comparable<T> ~ compareTo(T o1) (0) | 2024.05.29 |
Dynamic Programming์ด ์์ธ DFSโ๏ธ - ๋ด๋ฆฌ๋ง๊ธธ, ์์ฌ์์ด ํ๋ค๐ผ (0) | 2024.04.07 |
์ ๋ ฌโ๏ธ- ์์์ ๋ ฌ (0) | 2024.04.04 |