๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/17299)
< ์ค๋ฑํฐ์ >
๋ฌธ์ ํ์ด & ์๊ฐ
17298 ์คํฐ์ ๋ฌธ์ ์์ ์์ด์ ๋ฑ์ฅํ ํ์๋ง ์ถ๊ฐ๋ก ๊ตฌํ๋ ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์๋ค.
https://melody-coding.tistory.com/324
my solution (Java)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
import java.util.StringTokenizer;
public class _17299_ { // ์ค๋ฑํฐ์
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int n = Integer.parseInt(bf.readLine());
int arr[] = new int[n];
int result[] = new int[n];
int f[] = new int[1000001];
st = new StringTokenizer(bf.readLine());
for (int i = 0; i < n; i++) {
int num = Integer.parseInt(st.nextToken());
arr[i] = num;
f[num] += 1;
result[i] = -1;
}
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < n - 1; i++) {
if (f[arr[i]] < f[arr[i + 1]]) {
result[i] = arr[i + 1];
while (!stack.isEmpty()) {
if (f[arr[stack.peek()]] < f[arr[i + 1]]) {
int num = stack.pop();
result[num] = arr[i + 1];
} else {
break;
}
}
} else {
stack.add(i);
}
}
for (int i = 0; i < n; i++) {
bw.write(result[i] + " ");
}
bw.flush();
}
}
Main
- ์์ด A์ ํฌ๊ธฐ (n) ์ ๋ ฅ
- arr : ์์ด ์ ์ฅ
result: ์ค๋ฑํฐ์ ์ ์ฅ
f : ์์ด์์ ๋ฑ์ฅํ ํ์ ์ ์ฅ
- ์์ด์ ํ์ํ๋ฉฐ ํ์ฌ ๊ฐ์ ๋ฑ์ฅ ํ์์ ๋ค์ ๊ฐ์ ๋ฑ์ฅ ํ์๋ฅผ ๋น๊ต -> ๋ค์ ๊ฐ์ด ํ์ฌ ๊ฐ ๋ณด๋ค ํฌ๋ค๋ฉด ์ค๋ฑํฐ์ ์ด๋ฏ๋ก result ๋ฐฐ์ด์ ์ ์ฅ, stack์ ๊ฐ์ด ์๋์ง ํ์ธ ํ stack์ ์๋ ๊ฐ์ ๋ฑ์ฅ ํ์๊ฐ ๋ค์ ๊ฐ์ ๋ฑ์ฅ ํ์๋ณด๋ค ์๋ค๋ฉด stack์ ์๋ ๊ฐ์ ์ค๋ฑํฐ์๋ฅผ ์ฐพ์ ๊ฒ์ด๋ฏ๋ก ์ค๋ฑํฐ์ ์ ์ฅ But ์ค๋ฑํฐ์๊ฐ ์๋๋ผ๋ฉด ์ค๋ฑํฐ์๋ฅผ ์ฐพ๊ธฐ ์ํด stack์ ๊ฐ์ ์ ์ฅ
- result ๋ฐฐ์ด ์ถ๋ ฅ
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 2036_์์ด์ ์ ์ (0) | 2023.06.29 |
---|---|
[Baekjoon] 1789_์๋ค์ ํฉ (0) | 2023.06.28 |
[Baekjoon] 17298_์คํฐ์ (0) | 2023.06.28 |
[Baekjoon] 3425_๊ณ ์คํ (0) | 2023.06.27 |
[Baekjoon] 14267_ํ์ฌ ๋ฌธํ 1 (0) | 2023.06.27 |