17299번 : 오등큰수
크기가 N인 수열 A = A1, A2, ..., AN이 있다. 수열의 각 원소 Ai에 대해서 오등큰수 NGF(i)를 구하려고 한다.
Ai가 수열 A에서 등장한 횟수를 F(Ai)라고 했을 때, Ai의 오등큰수는 오른쪽에 있으면서 수열 A에서 등장한 횟수가 F(Ai)보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다. 그러한 수가 없는 경우에 오등큰수는 -1이다.
예를 들어, A = [1, 1, 2, 3, 4, 2, 1]인 경우 F(1) = 3, F(2) = 2, F(3) = 1, F(4) = 1이다. A1의 오른쪽에 있으면서 등장한 횟수가 3보다 큰 수는 없기 때문에, NGF(1) = -1이다. A3의 경우에는 A7이 오른쪽에 있으면서 F(A3=2) < F(A7=1) 이기 때문에, NGF(3) = 1이다. NGF(4) = 2, NGF(5) = 2, NGF(6) = 1 이다.
입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.
출력
총 N개의 수 NGF(1), NGF(2), ..., NGF(N)을 공백으로 구분해 출력한다.
생각해 볼 점
스택의 특성을 활용하는 문제입니다.
F함수가 추가되었을 뿐, 오큰수 문제와 크게 다르지 않습니다.
코드
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
int arr[1000001];
int F[1000001] = {0, };
int main()
{
int N;
scanf("%d", &N);
for(int i = 0; i < N; i++)
{
scanf("%d", &arr[i]);
F[arr[i]]++;
}
stack<int> st;
stack<int> ans;
for(int i = N - 1; 0 <= i; i--)
{
int ngf = -1;
while(!st.empty() && F[st.top()] <= F[arr[i]])
st.pop();
if(!st.empty())
ngf = st.top();
st.push(arr[i]);
ans.push(ngf);
}
while(!ans.empty())
{
printf("%d ", ans.top());
ans.pop();
}
return 0;
}
그 외
map을 사용하여 F(i)를 구하면 시간 초과가 나게 됩니다.
'공부 및 정리 > 백준 코드' 카테고리의 다른 글
[C++] 백준 - 9935번 문제 (0) | 2022.11.17 |
---|---|
[C++] 백준 - 25682번 문제 (0) | 2022.11.11 |
[C++]백준 - 2143번 문제 (0) | 2022.11.01 |
[C++] 백준 - 1799번 문제 (0) | 2022.10.27 |
[C++] 백준 - 1238번 문제 (0) | 2022.10.26 |