| 문제 정보 백준 17298번 오큰수 https://www.acmicpc.net/problem/17298 |
문제
크기가 N인 수열 A = A1, A2, ..., AN이 있다. 수열의 각 원소 Ai에 대해서 오큰수 NGE(i)를 구하려고 한다. Ai의 오큰수는 오른쪽에 있으면서 Ai보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다. 그러한 수가 없는 경우에 오큰수는 -1이다.
예를 들어, A = [3, 5, 2, 7]인 경우 NGE(1) = 5, NGE(2) = 7, NGE(3) = 7, NGE(4) = -1이다. A = [9, 5, 4, 8]인 경우에는 NGE(1) = -1, NGE(2) = 8, NGE(3) = 8, NGE(4) = -1이다.
입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.
출력
총 N개의 수 NGE(1), NGE(2), ..., NGE(N)을 공백으로 구분해 출력한다.
예제 입력 1
4
3 5 2 7
예제 출력 1
5 7 7 -1
예제 입력 2
4
9 5 4 8
예제 출력 2
-1 8 8 -1
//내 코드
#include<iostream>
using namespace std;
int main(){
int n, a[1000000], stack[1000000], top = -1;
cin >> n;
for(int i=0; i<n; i++){
cin >> a[i];
}
for(int i=0; i<n; i++){
int cnt = 0;
for(int j=i+1; j<n; j++){
if(a[i] < a[j]){
cout << a[j] << " ";
break;
}
else
cnt++;
}
if(cnt == n-i-1)
cout << "-1 ";
}
}
//정답 코드
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
vector<int> A(N, 0);
vector<int> ans(N, 0);
for (int i = 0; i < N; i++) {
cin >> A[i];
}
stack <int> myStack;
myStack.push(0);
for (int i = 1; i < N; i++) {
//스택 비어있지 않고 현재 수열이 스택 TOP인덱스 가르키는 수열보다 크면
while (!myStack.empty() && A[myStack.top()] < A[i]) {
ans[myStack.top()] = A[i]; //정답 배열에 오큰수를 현재 수열로 저장하기
myStack.pop();
}
myStack.push(i); //신규데이터 push
}
while (!myStack.empty()) {
// 반복문을 다 돌고 나왔는데 스택이 비어있지 않다면 빌 때 까지
ans[myStack.top()] = -1;
myStack.pop();
};
for (int i = 0; i < N; i++) { // 출력
cout << ans[i] << " ";
}
}
스택에 값이 아닌 인덱스 번호를 넣으며 대소를 비교하는 것이 중요하다.

'Do it! 알고리즘 코딩테스트 C++' 카테고리의 다른 글
| Do it! 알고리즘 코딩테스트 | 1. 자료구조 - 스택과 큐 | 014 절댓값 힙 구현하기 (0) | 2025.11.26 |
|---|---|
| Do it! 알고리즘 코딩테스트 | 1. 자료구조 - 스택과 큐 | 013 카드 게임 (0) | 2025.11.26 |
| Do it! 알고리즘 코딩테스트 | 1. 자료구조 - 스택과 큐 | 011 스택으로 수열 만들기 (0) | 2025.11.26 |
| Do it! 알고리즘 코딩테스트 | 1. 자료구조 - 슬라이딩 윈도우 | 009 DNA 비밀번호 (0) | 2025.11.26 |
| Do it! 알고리즘 코딩테스트 | 1. 자료구조 - 투 포인터 | 008 '좋은 수' 구하기 (0) | 2025.11.26 |