백준 알고리즘(C++)

백준 17298번 오큰수 ( C++ )

coding232624 2024. 3. 28. 13:35

문제

https://www.acmicpc.net/problem/17298

 

17298번: 오큰수

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.

www.acmicpc.net

 

해설

2중 for문을 이용할 경우 시간초과가 발생 (n값이 큼)

stack을 사용하여 시간문제 해결

코드

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
#include <bits/stdc++.h>
using namespace std;
int n, mp[1000004], ret[1000004], mn;
stack<int> s;
 
int main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
 
  cin >> n;
  fill(&ret[0], &ret[0+ n, -1);
  for (int i = 0; i < n; i++)
  {
    cin >> mp[i];
    while (s.size() && (mp[s.top()] < mp[i]))
    {
      ret[s.top()] = mp[i];
      s.pop();
    }
    s.push(i);
  }
 
  for (int i = 0; i < n; i++)
  {
    cout << ret[i] << " ";
  }
}
cs