문제
17298번: 오큰수
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.
www.acmicpc.net
코드1 (값을 이용하여 <- 방향으로 순회)
#include <bits/stdc++.h>
using namespace std;
int n, arr[1000001], ans[1000001];
stack<int> s;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
for (int i = n - 1; i >= 0; i--)
{
while (s.empty() == false && s.top() <= arr[i])
s.pop();
if (s.empty())
ans[i] = -1;
else
ans[i] = s.top();
s.push(arr[i]);
}
for (int i = 0; i < n; i++)
{
cout << ans[i] << " ";
}
return 0;
}
코드2 (인덱스를 이용하여 <- 방향으로 순회)
#include <bits/stdc++.h>
using namespace std;
int n, arr[1000001], ans[1000001];
stack<int> s;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
for (int i = n - 1; i >= 0; i--)
{
while (s.empty() == false && s.top() <= arr[i])
s.pop();
if (s.empty())
ans[i] = -1;
else
ans[i] = s.top();
s.push(arr[i]);
}
for (int i = 0; i < n; i++)
{
cout << ans[i] << " ";
}
return 0;
}
코드3 (인덱스를 이용하여 -> 방향으로 순회)
#include<bits/stdc++.h>
using namespace std;
int n, arr[1000004], ans[1000004];
stack<int> s;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
fill(ans, ans + 1000004, -1);
for (int i = 0; i < n; i++)
{
cin >> arr[i];
while (s.size() && arr[s.top()] < arr[i])
{
ans[s.top()] = arr[i];
s.pop();
}
s.push(i);
}
for (int i = 0; i < n; i++)
{
cout << ans[i] << " ";
}
return 0;
}
'개발 > 알고리즘' 카테고리의 다른 글
백준 1094 막대기 C++ (0) | 2021.05.05 |
---|---|
백준 1987 알파벳 C++ (0) | 2021.05.03 |
백준 17070 파이프옮기기1 C++ (0) | 2021.04.18 |
백준 1647 도시 분할 계획 C++ (0) | 2021.04.17 |
백준 1344 축구 C++ (0) | 2021.04.16 |