[JAVA]17299 ์ค๋ฑํฐ์(๊ณจ๋3, ์คํ)
๐ ๋ฌธ์
17299๋ฒ: ์ค๋ฑํฐ์
์ฒซ์งธ ์ค์ ์์ด A์ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ์ ์์ด A์ ์์ A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)์ด ์ฃผ์ด์ง๋ค.
www.acmicpc.net
๐ ์์ด๋์ด
ํด๋น ๋ฌธ์ ๋ ๋ฌธ์ ๋ฅผ ์ดํดํ๋๋ฐ ์๊ฐ์ด ์กฐ๊ธ ๊ฑธ๋ ธ์ต๋๋ค.
๊ฐ์ถ๋ ค์ ๋งํ๋ฉด ๊ฐ ์ซ์์ ๊ฐ์๋ฅผ ์ธ๊ณ i ๋ฒ์งธ ์ซ์์ ์ค๋ฅธ์ชฝ์ arr๋ด์ i๊ฐ ์๋ ์ซ์๋ณด๋ค ๋ ๋ง์ ์ซ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ซ์๋ฅผ ์ถ๋ ฅํ๋ฉด ๋ฉ๋๋ค.
arr : ์ ๋ ฅ ์ซ์ ๋ฐฐ์ด
dp(numCnt) : ๊ฐ ์ซ์์ ๊ฐ์
stack<int[]> -> int[3] = {์ธ๋ฑ์ค, ํด๋น ์ธ๋ฑ์ค์ ์ซ์, arr ๋ด์ ํด๋น ์ซ์์ ๊ฐ์) //์๋ ํ์ด์์๋ [2]๋ฒ์งธ ๊ฒ์ ์๋ตํ์ต๋๋ค.
ans : ๊ฒฐ๊ณผ
์คํ์ ๋ค์ด์ค๋ ๊ฐ์ ๊ฐ์๊ฐ stack์ peek์ ๊ฐ์๋ณด๋ค ํฌ๋ฉด ํด๋น ์ธ๋ฑ์ค์ ํ์ฌ ๊ฐ์ ์ ๋ ฅํฉ๋๋ค.
์์ ๊ทธ๋ฆผ์์๋ ์คํ์ ์์ด๋ ์์๋ก ๋ด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๐ ํ์ด
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
public class boj_17299_์ค๋ฑํฐ์2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int size = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
int[] arr = new int[size + 1];
int[] numCnt = new int[1_000_001];
//์ซ์์ ๊ฐ์๋ฅผ ์ผ๋ค (๊ธฐ์ ์ ๋ ฌ๊ณผ ๊ฐ์ bucket์ ๋ด๋ ๋ฐฉ๋ฒ)
for (int i = 1; i <= size; i++) {
arr[i] = Integer.parseInt(st.nextToken());
numCnt[arr[i]]++;
}
Stack<int[]> stack = new Stack<>();
int[] ans = new int[size + 1];
for (int i = 1; i <= size; i++) {
int[] temp = new int[]{i, arr[i]}; //์ธ๋ฑ์ค, ํด๋น ์ซ์
while (!stack.isEmpty() && numCnt[stack.peek()[1]] < numCnt[temp[1]]) {
//๊ฐ์๊ฐ ๋ ๋ง์ ์ซ์๊ฐ ๋ค์ด์ค๋ฉด ํด๋น ๊ฐ์ ๋ฐ๋ผ ์์ ์ธ๋ฐ์ค๋ฅผ ์ฑ์์ค๋ค.
int[] pop = stack.pop();
ans[pop[0]] = temp[1]; //ans[๊ฐ๋ฅ idx] = arr[i]
}
stack.push(temp);
}
for (int i = 1; i <= size; i++) {
sb.append(ans[i] == 0 ? -1 : ans[i]).append(" "); //์ฑ์์ง์ง ์์ ๊ฒฝ์ฐ -1
}
System.out.println(sb);
}
}
ํด๋น ํ์ด๋ 996ms๋ฅผ ์์ํ๊ณ
ํ๋จ์ ํ์ด๋ 992ms๋ฅผ ์์ํ์ต๋๋ค.
์ฐจ์ด์ ์ stack์ ์ธ๋ฑ์ค, ์ซ์, ์ซ์์ ๊ฐ์๋ฅผ ๋ชจ๋ ๋ฃ์ด ์ฝ๊ฒ ์ฝ๊ฒ ๋น๊ตํ์์ต๋๋ค. (๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ ๋์๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
public class boj_17299_์ค๋ฑํฐ์ {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int size = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
int[] arr = new int[size + 1];
int[] dp = new int[1_000_001];
for (int i = 1; i <= size; i++) {
arr[i] = Integer.parseInt(st.nextToken());
dp[arr[i]]++;
}
Stack<int[]> stack = new Stack<>();
int[] ans = new int[size + 1];
for (int i = 1; i <= size; i++) {
int[] temp = new int[]{i, arr[i], dp[arr[i]]}; //์ธ๋ฑ์ค, ์ซ์, ์ซ์์ ๊ฐ์
while (!stack.isEmpty() && stack.peek()[2] < temp[2]) {
int[] pop = stack.pop();
ans[pop[0]] = temp[1]; //ans[๊ฐ๋ฅ idx] = arr[i]
}
stack.push(temp);
}
for (int i = 1; i <= size; i++) {
sb.append(ans[i] == 0 ? -1 : ans[i]).append(" ");
}
System.out.println(sb);
}
}