코드 공부
백준 17299번 c++
유스베리이
2023. 4. 6. 16:28
앞에 오큰수와 문제 접근 방식은 비슷하게 가서 stack을 활용해야하나 같은 숫자의 개수로 비교하는 거라서 코드를 좀 더 추가 해야한다.
#include <iostream>
#include <stack>
#include<vector>
using namespace std;
int A[1000001]; //수열 크기를 제한
int B[1000001];
int main() {
int N; //N을 입력 받음
stack <int> stack;
cin >> N;
/*if (N < 1 || N > 1000000)
{
return 0;
}*/
//처음에는 중첩문을 사용하여 같은 값이 있을 때 F[i] 값을 하나씩 더하는 방법으로 진행
//for (int i = 0; i < N; i++) { //같은 숫자 개수 세서 F배열에 저장
// for (int j = 0; j < N; j++)
// {
// if (A[i] == A[j])
// {
// F[i]++;
// }
//
// }
//}--> 시간복잡도가 매우 증가 --> 좋은 코드가 아님.
// 따라서 사용한게 벡터
//vector 컨테이너는 자동으로 메모리가 할당되는 배열임.
vector <int> F(1000001, 0); // 벡터의 초기화
for (int i = 0; i < N; i++)
{
cin >> A[i];
F[A[i]]++; //입력받은 값을 인덱스로 정한뒤 그 값을 더하는 방식.
}
for (int i = N - 1; i >= 0; i--)
{
while (!stack.empty() && F[A[stack.top()]] <= F[A[i]])
stack.pop();
if (stack.empty()) B[i] = -1;
else B[i] = A[stack.top()];
stack.push(i);
}
// 정답 출력
for (int i = 0; i < N; i++)
cout << B[i] << " ";
return 0;
}
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
A | 1 | 1 | 2 | 3 | 4 | 2 | 1 |
F | 3 | 2 | 1 | 1 | |||
B | -1 | -1 | 1 | 2 | 2 | 1 | -1 |