일단 비교를 해야하니 담아둘 컨테이너가 필요하다.
배열을 백만개 선언할 수 도있고,
벡터를 이용할 수도 있지만,
간단하게 배열을 써보자.
그렇게 한다면, 최악의 경우 (제일 큰 숫자가 맨 오른쪽에 있는 경우)
탐색시간이 O(백만^2) 이 들어서 시간초과가 날 것이다.
스택에 하나씩 넣고 빼면서 비교해볼까
4
3 5 2 7
을 예로들면,
stack 3
stack 3 5
들어간 5가 3보다 크므로 출력
stack 3 5 2
stack 3 5 2 7
들어간 7이 5보다 크므로 출력
들어간 7이 2보다 크므로 출력
7 다음에 들어간 것이 없으므로 -1 출력
.... 흠 무언가 의미가 다가오지 않는다. 이럴 때는 발상을 뒤집어 보자.
배열에 3 5 2 7을 넣어놓고,
stack에 배열 끝 자리부터 거꾸로 담는다.
그전에 비교 대상을 넣어주기 위해 inf를 먼저 담는다. (inf = 1e7+10 로 설정)
stack inf
stack inf
스택 top이 7보다 크므로,
스택의 top을 answer[7의 index=3]에 저장한다.
하지만 top이 inf이면 -1을 저장한다.
그 후 7을 스택에 넣는다.
stack inf 7
스택 top이 2보다 크므로,
스택의 top(7)을 answer[2의 index=2]에 저장한다.
그 후 2를 스택에 넣는다.
stack inf 7 2
스택 top이 원소 5보다 작다! ("2")
과감히 pop한다. 작은 것이 없을 때까지.
즉, 오른쪽에 있는 숫자 중에서 큰 수중 가장 왼쪽에 있는 것(가장 최근을 고르고 있는 중인것이다!
stack inf 7
스택 top이 원소 5보다 크다.
스택의 top(7)을 answer[5의 인덱스=1]에 저장한다.
그 후 5를 스택에 넣는다.
stack inf 7 5
스택 top이 원소 3보다 크다.
스택의 top(5)을 answer[3의 인덱스=0]에 저장한다.
이렇게 for문을 다 돌았으면, answer를 순서대로 출력한다.
#include <cstdio>
#include <stack>
using namespace std;
stack<int> s;
int a[1000000];
int ans[1000000];
int main() {
int n;
scanf("%d", &n);
for (int i=0; i<n; i++){
scanf("%d", &a[i]);
}
s.push(1e7+1);
for (int i=n-1; i>=0; i--){
while(s.top() <= a[i]) s.pop();
if (s.top() > 1e7) ans[i] = -1;
else ans[i] = s.top();
s.push(a[i]);
}
for (int i=0; i<n; i++){
printf("%d ", ans[i]);
}
return 0;
}
'알고리즘, 자료구조 > 알고리즘' 카테고리의 다른 글
[brute-force] 1436 영화감독 숌 (0) | 2019.07.16 |
---|---|
[brute-force] 2798 블랙잭 (0) | 2019.07.15 |
Greedy 알고리즘 (2) | 2019.07.14 |
1966 프린터 큐 (589) | 2019.07.01 |
11729 하노이 탑 (719) | 2019.06.28 |
댓글