#include <iostream>
#include <stack>
using namespace std;
// 오큰수가 의미하는 것
// NGE[1] ... 배열의 첫번째 인덱스의 오큰수를 의미함
// 즉, 배열의 첫번째 인덱스 값에 존재하는 요소보다 큰 가장 왼쪽의 요소를 의미함.
// 정답 백터
int main()
{
ios_base :: sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int num;
cin >> num;
int OrderList[num]; // 입력값 저장
int answer[num]; // 출력값 저장
stack<int> TmpStack;
for(int i=0; i < num; i++)
cin >> OrderList[i];
for(int i=num-1; i >= 0; i--)
{ // 3 5 2 7
while (!TmpStack.empty() && TmpStack.top() <= OrderList[i])
TmpStack.pop();
if(TmpStack.empty())
answer[i] = -1;
else
answer[i] = TmpStack.top();// -1 7 7 5
TmpStack.push(OrderList[i]); // 7 5 3
}
for(auto &el : answer)
cout << el << " ";
cout << endl;
}
for(int i=0; i < num; i++)
cin >> OrderList[i];
역순으로 받아야 스택의 pop, push를 적절하게 사용할 수 있기 때문.
TmpStack.push(OrderList[i])
임시스택 ... pop
- 임시스택이 비었으면 ... (처음 루프문을 돌 경우에도 적용)
- answer[i] = -1;
- 임시스택이 비어있지 않으면
- answer[i] = TmpStack.top()
for(int i=num-1; i >= 0; i--)
{ // 임시스택이 비어있지 않고, 오큰수값 TmpStack.top()이 나올때 까지
while (!TmpStack.empty() && TmpStack.top() <= OrderList[i])
TmpStack.pop();
if(TmpStack.empty())
answer[i] = -1;
else
answer[i] = TmpStack.top();// -1 7 7 5
TmpStack.push(OrderList[i]); // 7 5 3
}
n = 4
임의의 수열 : [ 3 5 2 7 ]
i = 0
TmpStack [ ]
OrderList [ 7 ]
TmpStack.empty()
answer[ i ] = -1
TmpStack.push( 7 )
i = 1
TmpStack[ 7 ]
OrderList [ 2 ]
! TmpStack.empty()
! TmpStack[ 7 ] ≤ OrderList[ 2 ]
answer[ i ] = TmpStack[ 7 ]
TmpStack.push( 2 );
i = 2
TmpStack[ 7 2 ]
...
스택문제는 스택으로 푸는 이유가 있다..