fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 17299 (C++) 오등큰수
최초 업로드: 2025-04-25 15:07:09
최근 수정 시간: 2025-07-25 09:05:38
게시자: rlatjwls3333
카테고리: 백준
조회수: 8
# [Gold III] 오등큰수 #### [문제 링크](https://www.acmicpc.net/problem/17299) ## 문제 설명 <p>크기가 N인 수열 A = A<sub>1</sub>, A<sub>2</sub>, ..., A<sub>N</sub>이 있다. 수열의 각 원소 A<sub>i</sub>에 대해서 오등큰수 NGF(i)를 구하려고 한다.</p> <p>A<sub>i</sub>가 수열 A에서 등장한 횟수를 F(A<sub>i</sub>)라고 했을 때, A<sub>i</sub>의 오등큰수는 오른쪽에 있으면서 수열 A에서 등장한 횟수가 F(A<sub>i</sub>)보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다. 그러한 수가 없는 경우에 오등큰수는 -1이다.</p> <p>예를 들어, A = [1, 1, 2, 3, 4, 2, 1]인 경우 F(1) = 3, F(2) = 2, F(3) = 1, F(4) = 1이다. A<sub>1</sub>의 오른쪽에 있으면서 등장한 횟수가 3보다 큰 수는 없기 때문에, NGF(1) = -1이다. A<sub>3</sub>의 경우에는 A<sub>7</sub>이 오른쪽에 있으면서 F(A<sub>3</sub>=2) < F(A<sub>7</sub>=1) 이기 때문에, NGF(3) = 1이다. NGF(4) = 2, NGF(5) = 2, NGF(6) = 1 이다.</p> ## 입력 <p>첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째에 수열 A의 원소 A<sub>1</sub>, A<sub>2</sub>, ..., A<sub>N</sub> (1 ≤ A<sub>i</sub> ≤ 1,000,000)이 주어진다.</p> ## 출력 <p>총 N개의 수 NGF(1), NGF(2), ..., NGF(N)을 공백으로 구분해 출력한다.</p> ## 풀이 #### 각 숫자들이 나온 횟수를 기억하고, 입력된 수열의 뒤쪽부터 스택에 넣으면서, 스택에서 등장 횟수가 자신보다 큰 가장 앞에 있는 원소들을 검사하면 된다. 스택에서 나오는 순서는 현재 값과 가까운 순으로 배치되기에 언제나 오등큰수를 만족한다. ``` c++ #include<bits/stdc++.h> using namespace std; const int MAX = 1'000'001; int arr[MAX], cnt[MAX], res[MAX]; int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; for(int i=1;i<=n;i++) { cin >> arr[i]; cnt[arr[i]]++; } stack<int> stk; for(int i=n;i>=1;i--) { while(!stk.empty() && cnt[stk.top()] <= cnt[arr[i]]) stk.pop(); if(stk.empty()) res[i] = -1; else res[i] = stk.top(); stk.push(arr[i]); } for(int i=1;i<=n;i++) cout << res[i] << ' '; } ```