크기가 N인 수열 A = A1, A2, ..., AN이 있다. 수열의 각 원소 Ai에 대해서 오큰수 NGE(i)를 구하려고 한다. Ai의 오큰수는 오른쪽에 있으면서 Ai보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다. 그러한 수가 없는 경우에 오큰수는 -1이다.
예를 들어, A = [3, 5, 2, 7]인 경우 NGE(1) = 5, NGE(2) = 7, NGE(3) = 7, NGE(4) = -1이다. A = [9, 5, 4, 8]인 경우에는 NGE(1) = -1, NGE(2) = 8, NGE(3) = 8, NGE(4) = -1이다.
첫 풀이에서 개별적인 array에 오큰수에 해당하는 원소를 찾기 위해 매 원소마다 input으로 주어진 array만큼 탐색하니 결과는 시간초과.
이에 오큰수에 해당하는 인덱스를 스택에 push & pop하는 방향으로 풀었더니 시간초과를 해결하였다.
const input = require("fs")
.readFileSync(__dirname + "/input.txt")
.toString()
.trim()
.split("\n")
.map((x) => x.split(" ").map(Number));
let stack = [];
for (let i = 0; i < input[1].length; i++) {
while (stack.length && input[1][stack[stack.length - 1]] < input[1][i]) {
input[1][stack.pop()] = input[1][i];
}
stack.push(i);
}
while (stack.length > 0) {
input[1][stack.pop()] = -1;
}
console.log(input[1].join(" "));