문제 링크입니다: https://www.acmicpc.net/problem/17299
17299번: 오등큰수
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째에 수열 A의 원소 A1, A2, ..., AN (1 ≤ Ai ≤ 1,000,000)이 주어진다.
www.acmicpc.net
N이 최대 1,000,000이기 때문에 O(N^2) 풀이법을 사용하여 풀었다면 TLE가 발생하는 문제였습니다.
따라서 저는 스택을 이용하여 역순으로 확인하며 결과들을 result 배열에 저장했습니다.
자세한 풀이는 주석을 확인해주시면 될 것 같습니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <stack> | |
using namespace std; | |
const int MAX = 1e6 + 10; | |
int arr[MAX]; | |
int visited[MAX]; | |
int result[MAX]; | |
stack<pair<int, int>> st; | |
int main(void) | |
{ | |
ios_base::sync_with_stdio(0); | |
cin.tie(0); | |
int N; | |
cin >> N; | |
for (int i = 0; i < N; i++) | |
{ | |
cin >> arr[i]; | |
visited[arr[i]]++; | |
} | |
// 맨 뒤에 있는 숫자부터 확인 | |
for (int i = N - 1; i >= 0; i--) | |
{ | |
// 현재 위치한 숫자가 발생한 빈도보다 스택의 top에 있는 빈도가 작거나 같다면 pop | |
while (!st.empty() && visited[arr[i]] >= st.top().first) | |
{ | |
st.pop(); | |
} | |
// 오른쪽에 조건을 만족하는 숫자가 없다면 -1 있다면 스택의 top | |
result[i] = st.empty() ? -1 : st.top().second; | |
// 스택에는 계속 추가해줘야 함 {해당 숫자 빈도수, 해당 숫자} | |
st.push({ visited[arr[i]], arr[i] }); | |
} | |
for (int i = 0; i < N; i++) | |
{ | |
cout << result[i] << " "; | |
} | |
cout << "\n"; | |
return 0; | |
} |


개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
반응형
'알고리즘 > BOJ' 카테고리의 다른 글
백준 13459번 구슬 탈출 (0) | 2020.02.05 |
---|---|
백준 2615번 오목 (0) | 2020.02.03 |
백준 1526번 가장 큰 금민수 (1) | 2020.01.30 |
백준 15596번 정수 N개의 합 (0) | 2020.01.30 |
백준 1816번 암호 키 (8) | 2019.11.25 |