언젠가 정렬이 될 수 있으면 좋겠네.

월간 향유회 2023. 12. · Arena #15 E번 heeda0528

사전 순 최소는 앞 원소부터 가능한 작은 수로 채우는 것이 최적입니다.

현재 사전 순 최소인 수열을 kk번째까지 완성했고, 다음 원소를 결정할 차례라고 해봅시다.

Ti=T_i = 남은 수 중 AiA_i보다 앞에 있으면서 AiA_i와 서로소가 아닌 수의 개수 라고 정의하겠습니다.

처음에 TT 배열은 cal(O)(N2logX)cal(O)(N^2 log X)에 구성할 수 있습니다.

자신보다 앞에 있는 수 중 자신과 서로소가 아닌 것이 있다면 자신은 맨 앞으로 이동할 수 없습니다.

따라서 남은 수 중 다음 원소가 될 수 있는 것은 Ti=0T_i = 0AiA_i입니다.

이러한 AiA_i들 중 가장 작은 수를 다음 원소로 결정하는 것이 최적입니다.

ApA_p를 다음 원소로 결정했다면, p<qp < q 이고 ApA_pAqA_q가 서로소인 모든 qq에 대해 TqT_q11 감소시킬 수 있습니다.

이를 총 NN번 반복하면 사전 순으로 최소인 수열을 얻을 수 있습니다.

전체 시간복잡도는 cal(O)(N2logX)cal(O)(N^2 log X)입니다.

삽입 정렬과 유사하게 진행하는 풀이도 있습니다.

수열 AA의 앞 k1k - 1개의 원소들만으로 사전 순 최소를 만들었고, AkA_k를 적절한 위치에 끼워넣는 상황을 생각해봅시다.

AkA_kAiA_i보다 작으면서 그 사이의 모든 수가 AkA_k와 서로소라면 AkA_kAiA_i 자리에 삽입할 수 있고, 이러한 위치 중 가장 앞을 택하는 것이 최적입니다.

이를 총 NN번 반복하면 사전 순으로 최소인 수열을 얻을 수 있습니다.

위의 증명은 독자의 몫으로 남깁니다.