1. 문제
오등큰수 성공
시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초 | 512 MB | 1000 | 413 | 332 | 41.345% |
문제
크기가 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)을 공백으로 구분해 출력한다.
예제 입력 1 복사
7 1 1 2 3 4 2 1
예제 출력 1 복사
-1 -1 1 2 2 1 -1
2. 소스코드
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
//vector<int> freq(n);
//vector<int> freq(n + 1);
vector<int> freq(1000001);
vector<int> input(n);
vector<int> ans(n);
for (int i = 0; i < n; i++) {
cin >> input[i];
freq[input[i]]++;
}
stack<int> temp;
temp.push(0);
for (int i = 1; i < n; i++) {
if (temp.empty()) {
temp.push(i);
}
while (!temp.empty() && freq[input[temp.top()]] < freq[input[i]] ){
ans[temp.top()] = input[i];
temp.pop();
}
temp.push(i);
}
while (!temp.empty()){
ans[temp.top()] = -1;
temp.pop();
}
for (int i = 0; i < n; i++) {
cout << ans[i] << ' ';
}
return 0;
}
'알고리즘 > BOJ(백준)' 카테고리의 다른 글
[ 백준-1260번 / DFS/BFS ] DFS와 BFS (0) | 2020.03.08 |
---|---|
[ 백준-13023번 / 그래프 ] ABCDE (0) | 2020.03.08 |
[ 백준-17298번 / 스택 ] 오큰수 (0) | 2020.03.05 |
[ 백준-10799번 / 스택 ] 쇠막대기 (0) | 2020.03.04 |
[ 백준-17413번 / 스택 ] 단어 뒤집기2 (0) | 2020.03.04 |