크기가 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

+ Recent posts