반응형
https://www.acmicpc.net/problem/17298
본 문제는 입력의 크기가 1,000,000이므로 O(n^2)의 연산으로 해결할 수 없다. 따라서, 다른 방법으로 해결해야 하는데 stack을 이용해야 한다. stack을 사용해야 된다는 것은 알았는데, 어떻게 사용해야 할지 도저히 감이 잡히지 않았다. 정답을 보고 해결하였는데 stack에 index를 저장해야 한다.
- stack에 index를 저장
- index에 해당하는 배열보다 큰 배열의 값이 있을 경우
- 정답 배열의 index 번째에 저장하고 stack pop
- 없을 경우 stack에 index 저장
- stack이 empty가 아닐 때 stack top의 index 번째 정답 배열에 -1 입력
- 정답 배열 출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#include <cstdio>
#include <stack>
using namespace std;
int main() {
int d[1000000];
int ans[1000000];
int t;
scanf("%d", &t);
for (int i = 0; i < t; i++) {
scanf("%d", &d[i]);
}
stack<int> st;
st.push(0);
for (int i = 1; i < t; i++) {
if (st.empty()) st.push(i);
while (!st.empty() && d[st.top()] < d[i]) {
ans[st.top()] = d[i];
st.pop();
}
st.push(i);
}
while (!st.empty()) {
ans[st.top()] = -1;
st.pop();
}
for (int i = 0; i < t; i++) {
printf("%d", ans[i]);
if (i != t-1) printf(" ");
}
printf("\n");
return 0;
}
|
cs |
반응형
'백준' 카테고리의 다른 글
[백준 11052] 카드 구매하기, C++ (0) | 2020.01.11 |
---|---|
[백준] 1463 - 1로 만들기, C++ (0) | 2020.01.10 |
[백준] 2004 - 조합 0의 개수, C++ (0) | 2020.01.09 |
[백준 1675] 팩토리얼 0의 개수, C++ (0) | 2020.01.09 |
[백준 6588] 골드바흐의 추측, C++ (0) | 2020.01.09 |
댓글