문제 링크 입니다
https://www.acmicpc.net/problem/2493
스택을 이용하는 문제였는데 잘 한건지 모르겠네요.
처음에 그래서 스택을 무조건 써야겠다고 생각해서
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
#include<iostream>
#include<stack>
using namespace std;
int main() {
ios_base :: sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
stack<pair<int, int>> s;
stack<pair<int, int>> s2;
stack<int> ans;
for (int i = 1; i <= n; i++) {
int k;
cin >> k;
s.push(make_pair(k, i));
}
for (int i = 0; i < n; i++) {
int num;
num = s.top().first;
s.pop();
while (1) {
if (s.empty()) {
ans.push(0);
break;
}
else if (s.top().first>= num) {
break;
}
s2.push(make_pair(s.top().first, s.top().second));
s.pop();
}
for (int i = 0; i < s2.size(); i++) {
s.push(make_pair(s2.top().first, s2.top().second));
s2.pop();
}
}
for (int i = 0; i < n; i++) {
ans.pop();
}
}
|
이런식으로 반복문을 여러개 썻더니
이런 결과가 나왔고
수정한 코드가
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
37
38
39
40
41
42
|
#include<iostream>
#include<stack>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
pair<int, int> p[500000];
for (int i = 1; i <= n; i++) {
int k;
cin >> k;
p[i].first = i;
p[i].second = k;
}
stack<int> ans;
int a;
for (int i = n ; i >= 1; i--) {
a = i - 1;
while (1) {
if (p[i].second <= p[a].second) {
break;
}
a--;
if (a == -1) {
ans.push(0);
break;
}
}
}
for (int i = 0; i < n; i++) {
ans.pop();
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
이코드 입니다
알고리즘은 간단하게
1. pair 에 탑 높이와 번호를 입력하고
2.반복문을 통해 뒤에서부터 앞으로 탐색하면서 본인보다 탑 높이가 크거나 같으면 ans스택에 탑 번호를 push
3.끝까지 찾지 못했을 경우 ans 에 0을 push
4.ans 스택을 출력하면서 pop 하였습니다 .
'c++ > 백준' 카테고리의 다른 글
백준 14500번 : 테트로미노 (0) | 2020.03.25 |
---|---|
백준 2841번 외계인의 기타연주 (0) | 2019.11.21 |
백준 5397 키로거 (0) | 2019.11.21 |
백준 10799번 쇠막대기 (0) | 2019.11.20 |
백준 1918번 후위표기식 (0) | 2019.11.19 |