[๋ฐฑ์ค] ๐ง 1725 ํ์คํ ๊ทธ๋จ
๐ ๋์ด๋
๐ง Platinum 5
๐ ๋ฌธ์
https://www.acmicpc.net/problem/1725
๐ ํ์ด
์ ๋ฒ์ ์ฒ์์ผ๋ก ์ํธ
๋ผ๋ ํ๋ ํฐ๋ ๋ฌธ์ ๋ฅผ ํ๊ณ ๋์ 2๋ฒ์งธ๋ก ๋์ ํด๋ณด๋ ํ๋ ํฐ๋ ๋ฌธ์ ์๋ค.
์ฒ์ ์ด ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ๋ ์๊ฐ์ ์ด๊ฑฐ ์์ ํ์ ๋ฌธ์ ์ธ๊ฐ?
๋ผ๋ ๋ฐ์์ด์๋ค.
์๋ํ๋ฉด ์ต๋ ๋์ด๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋ ๋ฌด์กฐ๊ฑด ๋์ฌ ์ ์๋ ๋ชจ๋ ์ฌ๊ฐํ์ ๋์ด๋ฅผ ๊ตฌํํ, ๊ทธ ๊ฐ๋ค์ max
์ณ์ ๊ตฌํด์ผ ํ์ง ์๊ฒ ๋๋ ์๊ฐ์ด์๋ค.
๊ทธ๋์ ๋ชจ๋ ์ง์ฌ๊ฐํ์ ๋์ด๋ฅผ ์ด๋ป๊ฒ ํด์ผ์ง ์๊ฐ์ด๊ณผ๊ฐ ๋จ์ง ์์๊น๋ผ๊ณ ๊ณ ๋ฏผํ์๋ค.
์ผ๋จ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ณ์ฐํด๋ณด๋ n = 100000
์ด๋ฏ๋ก o(nlog(n)) โ 20,000,000 (0.2์ด)
๊ฐ ์ธ ์ ์๋ ์ต๋ํ์ ์๊ฐ์ด์๋ค.
๊ทธ๋์ for๋ฌธ
์ ํ๋ฒ ๋๋ฆฌ๋ฉด์ ์๋ฌด๋ฆฌ ์ปค๋ log(n)
์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ณ ํ์์ ํด์ผํ๋ค.
์ด๋ฐ ๊ณ ๋ฏผ์ ํ๋ ์ฐจ์ Stack
์ด๋ผ๋ ํํธ๋ฅผ ์ป๊ณ ๋์ ๊ฐ์๊ธฐ ์๊ฐ์ด ๋ฒ๋ฉ ๋ค์๋ค.
๋ฐ๋ก for(int i)๋ฌธ
์์ 0~N๊น์ง ๊ฐ๋ฉด์ stack<Integer[]>
์ ๊ทธ ์์น์์์ ๋์ด ์ฆ value
๋ผ๋ ๋ณ์์ i
๋ผ๋ ์ฃผ์๊ฐ์ ๋ฃ์๋ค.
๋ค์์ ์๋ก stack
์ ๊ฐ์ ์ง์ด๋ฃ์๋ ์ด์ ๊ฐ๊ณผ ๋น๊ตํด์ ๋์ด๊ฐ ๋ ๋์ผ๋ฉด ๊ทธ๋๋ก ์ง์ด๋ฃ๊ณ , ๋ ์์ผ๋ฉด ๋ ํฐ ๊ฐ์ด ๋์ค๊ฑฐ๋ ๋น ๋๊น์ง ๋นผ๋ฉด์ ๋บ ๊ฐ์ index๊ฐ
๊ณผ ํ์ฌ index๊ฐ
์ ์ฐจ์ด์ ๋์ด๋ฅผ ๊ณฑํด์ max
๊ณผ Math.max
๋ฅผ ๊ณ์ฐํด ์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ stack
์ ์๋ก ๋ฃ๋ ๊ฐ์ ๋บ ๊ฐ์ index๊ฐ
์ value
๋ฅผ ๋ํด์ฃผ์๋ค.
์ดํ ์ด ๋ชจ๋ ๊ณผ์ ์ ๊ฑฐ์น ํ stack
์๋ ์๋์ผ๋ก ๊ฐ์ฅ ์์ ๋์ด๊ฐ 1๊ฐ๋ง ๋จ๊ฒ ๋๋ค.
๊ทธ๋์ ๋ง์ง๋ง์ผ๋ก ๋จ์ ๊ฐ๊ณผ n์ ๊ณฑํ๊ฐ์ max
์ ๋น๊ตํด์ ์ต๋๊ฐ์ ์ถ๋ ฅํด์ฃผ์๋ค.
์ดํ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๊ฐ ์์ฑ๋์๋ค.
ํ๋ ํฐ๋ ๋ฌธ์ ์ด์ง๋ง ์๊ฐ๋ณด๋ค ์ฝ๊ฒ ํ๋ ค์ ์ข์๋ค. ๐
๐ Code
package BOJ.DS;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class N1725 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
Stack<Integer[]> st = new Stack<>();
int max = 0;
st.add(new Integer[]{Integer.parseInt(br.readLine()), 0});
for (int i = 1; i < N; i++) {
int num = Integer.parseInt(br.readLine());
if (num > st.peek()[0]) {
st.add(new Integer[]{num, i});
} else if (num == st.peek()[0]) {
//์๋ฌด๊ฒ๋ ์ํ๋ค.
} else {
Integer[] arr = st.pop();
max = Math.max(arr[0] * (i - arr[1]), max);
while (!st.isEmpty() && num < st.peek()[0]) {
arr = st.pop();
max = Math.max(arr[0] * (i - arr[1]), max);
}
st.add(new Integer[]{num, arr[1]});
}
}
while (!st.isEmpty()) {
Integer[] arr = st.pop();
max = Math.max(arr[0] * (N - arr[1]), max);
}
System.out.println(max);
}
}
package (์ด๋ฆ); ๋ฅผ ๋๊ณ , class ์ด๋ฆ์ Main
์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
๐ ์ถ๊ฐ ์์
[Input]
8
1
2
3
4
5
6
7
8
[Output]
20
๊ฐ์ธ ๊ณต๋ถ ๊ธฐ๋ก์ฉ ๋ธ๋ก๊ทธ์
๋๋ค.
ํ๋ฆฌ๊ฑฐ๋ ์ค๋ฅ๊ฐ ์์ ๊ฒฝ์ฐ ์ ๋ณดํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.๐