크기가 N인 수열 A = A[1], A[2], ..., A[N]이 있다. 수열의 각 원소 A[i]에 대해서 오등큰수 NGF(i)를 구하려고 한다.
Ai가 수열 A에서 등장한 횟수를 F(A[i])라고 했을 때, A[i]의 오등큰수는 오른쪽에 있으면서 수열 A에서 등장한 횟수가 F(A[i])보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다. 그러한 수가 없는 경우에 오등큰수는 -1이다.
예를 들어, A = [1, 1, 2, 3, 4, 2, 1]인 경우 F(1) = 3, F(2) = 2, F(3) = 1, F(4) = 1이다. A[1]의 오른쪽에 있으면서 등장한 횟수가 3보다 큰 수는 없기 때문에, NGF(1) = -1이다. A[3]의 경우에는 A[7]이 오른쪽에 있으면서 F(A[3]=2) < F(A[7]=1) 이기 때문에, NGF(3) = 1이다. NGF(4) = 2, NGF(5) = 2, NGF(6) = 1 이다.
입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째에 수열 A의 원소 A[1], A[2], ..., A[N] (1 ≤ A[i] ≤ 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 |
더보기
Solution
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int N, *A=NULL, *NGF=NULL, *stack=NULL, current=0, *frequency=NULL, max=0;
scanf("%d", &N);
A=(int *)malloc(N*sizeof(int));
NGF=(int *)calloc(N,sizeof(int));
stack=(int *)malloc(N*sizeof(int));
for(int n=0;n<N;n++)
{
scanf("%d", &A[n]);
if(A[n]>max)
max=A[n];
}
frequency=(int *)calloc(max+1,sizeof(int));
for(int n=0;n<N;n++)
frequency[A[n]]++;
for(int n=0;n<N;n++)
{
while(current>0)
if(frequency[A[stack[current-1]]]<frequency[A[n]])
NGF[stack[--current]]=A[n];
else
break;
stack[current++]=n;
}
for(int n=0;n<N;n++)
printf("%d ", NGF[n]==0?-1:NGF[n]);
printf("\n");
free(frequency);
free(NGF);
free(stack);
free(A);
return 0;
}
728x90
'백준 알고리즘' 카테고리의 다른 글
<백준 알고리즘> 15683번: 감시 (0) | 2023.02.22 |
---|---|
<백준 알고리즘> 2661번: 좋은수열 (0) | 2023.02.21 |
<백준 알고리즘> 6198번: 옥상 정원 꾸미기 (0) | 2023.02.21 |
<백준 알고리즘> 1074번: Z (0) | 2023.02.20 |
<백준 알고리즘> 1992번: 쿼드트리 (0) | 2023.02.20 |