1. ๋ฌธ์ ์ค๋ช
2. ์ ๊ทผ ๋ฐฉ์
0. ์ฌ์ ์ธํ
Node Class : ๋ฉค๋ฒ ๋ณ์๋ก index์ value๋ฅผ ๊ฐ์ง๊ณ ์๋ค. index๋ ์ ๋ ฅ์์ ํด๋น ๊ฐ์ด ๋์จ ์์๋ฅผ ์ ์ฅํ๊ณ , value๋ ์ค์
๊ฐ์ ์ ์ฅํ๋ค.
NGE ๋ฐฐ์ด : index์ ํด๋นํ๋ ์ ๋ ฅ ๊ฐ์ ์คํฐ์๊ฐ ๋ฌด์์ธ์ง ์ ์ฅํ๋ค.
top : stack์ ๋ฐฐ์ด๋ก ๊ตฌํํ์๊ธฐ ๋๋ฌธ์ top์ด ์ด๋์ธ์ง ์๋ ค์ค ๋ณ์๋ก ์ฌ์ฉํ๋ค.
1. ์๋ฆฌ
stack์ด ๋น์ด์์ผ๋ฉด ํ์ฌ ์กฐํ ์ค์ธ ์ ๋ ฅ๊ฐ์ ๋ฃ๋๋ค.
stack์ด ๋น์ด์์ง ์์ ๊ฒฝ์ฐ stack.top๊ณผ ํ์ฌ ์กฐํ ์ค์ธ ์ ๋ ฅ๊ฐ(A)๋ฅผ ๋น๊ตํ๋ค.
stack.top < A ์ธ ๊ฒฝ์ฐ
stack.top์ ์คํฐ์๋ A์ด๋ฏ๋ก NGE ๋ฐฐ์ด์ top์ index์ A๋ฅผ ์ ์ฅํ๋ค.
stack.top์ ์คํฐ์๋ ์ ํด์ก์์ผ๋ก popํ๊ณ , ๊ทธ ๋ค์ top๊ณผ A๋ฅผ ๋ ๋น๊ตํ๋ค.stack.top >= A์ธ ๊ฒฝ์ฐ
stack.top์ ์คํฐ์๋ ์์ง ๋์ค์ง ์์๋ค. ๋ฐ๋ผ์ A๋ฅผ stack์ pushํ๋ค.
NGE ๋ฐฐ์ด์ ์ถ๋ ฅํ๋ฉด ๊ฐ ์์น๋ณ ์คํฐ์๋ฅผ ๊ตฌํ ์ ์๋ค.
- ์ด๋ ๊ฐ์ด 0์ธ ๋ถ๋ถ์ ์ ๋ ฅ ์ ์ฒด์์ ์คํฐ์๊ฐ ์๋ ์์ด๋ค. ํด๋น ๊ฐ์ -1๋ก ๋ณํํ์ฌ ์ถ๋ ฅํ๋ค.
3. ์ฝ๋ ๋ถ์
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
Node [] stack = new Node [N];
int [] NGE = new int [N];
int top = -1;
StringTokenizer st = new StringTokenizer(br.readLine());
stack[++top] = new Node(0, Integer.parseInt(st.nextToken()));
for (int i = 1; i < N; i++) {
Node now = new Node(i, Integer.parseInt(st.nextToken()));
while (top != -1 && stack[top].v < now.v){
NGE[stack[top].i] = now.v;
stack[top--] = null;
}
if(top == -1 || stack[top].v >= now.v){
stack[++top] = now;
}
}
for (int value : NGE){
sb.append(value == 0? -1 : value).append(" ");
}
System.out.println(sb);
}
}
class Node {
int i;
int v;
public Node (int i, int v){
this.i = i;
this.v = v;
}
}
4. ์ฑ์ฅํ๊ธฐ
๋๋ ํด๋น ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด, ํด๋์ค๋ฅผ ์ฌ์ฉํ์๋ค. ๊ฐ๋ ์ฑ ๋ฉด์์๋ ์ข์ง๋ง, ์๋ ๋ฉด์์ ์กฐ๊ธ ๋๋ ค์ง ์ ์๋ค. ๊ทธ๋์ ์ฑ ์ ์๋ ํ์ด๋ฅผ ๋ดค๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฌธ์ ๋ฅผ ํ์๋ค.
- stack์๋ index๋ง push, pop ํ๊ณ , value๋ฅผ ๋ค๋ฅธ ๋ฐฐ์ด(value)์ ๋ฐ๋ก ์ ์ฅํด์, ์ด๊ฒ์ ํตํด ๋น๊ตํ๋ค.
์๋ฅผ ๋ค์ด, value[stack[top]] < value[i] (stack์ ์ต์๋จ์ ์๋ ๊ฐ๊ณผ ํ์ฌ ์กฐํ ์ค์ธ ๊ฐ์ ๋น๊ต) - ๋ด๊ฐ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ index์ value๋ฅผ ๋ฌถ์ด ๊ด๋ฆฌํ๋ ๊ฒ์ index์ฉ stack๊ณผ value์ฉ ๋ฐฐ์ด๋ก ๋๋์ด์ ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ํธ๋๊น, ์กฐ๊ธ์ด์ง๋ง ์๋๊ฐ ์ค์ด๋ค์๋ค.
5. ๋ค๋ฅธ ํ์ด
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
int [] value = new int[N]; // index์ ํด๋นํ๋ value ์ ์ฅ
int [] stack = new int[N]; // index ๋ง ์ ์ฅ
int [] nge = new int[N]; // index ๋น ์์ ์ ์คํฐ์ ์ ์ฅ
int top = -1;
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
value[i] = Integer.parseInt(st.nextToken());
}
stack[++top] = 0;
for (int i = 1; i < N; i++) {
// ํ์ฌ ์กฐํ ์ค์ธ ๊ฐ๋ณด๋ค stack์ top ๊ฐ์ด ์์ ๊ฒฝ์ฐ
while(top != -1 && value[stack[top]] < value[i]){
nge[stack[top--]] = value[i];
}
if(top == -1 || value[stack[top]] >= value[i]){
stack[++top] = i;
}
}
for (int now : nge){
sb.append(now == 0? -1 : now).append(" ");
}
System.out.println(sb);
}
}