꿍은 자료구조를 공부하다가, 정렬마다 비교 횟수를 세어 보라는 문제에 진력이 나서 세상에서 가장 얄궂은 문제를 만들어 보기로 했다.
정수 N과 X가 주어진다. 1부터 N까지의 정수로 이루어진 순열 중에서, 삽입 정렬이 퀵 정렬보다 비교를 더 하되 그 차이가 최대 X번인 순열의 개수를 세어야 한다. 즉, 한 순열에 대해 삽입 정렬의 비교 횟수를 NI, 퀵 정렬의 비교 횟수를 NQ라 할 때 1 ≤ NI - NQ ≤ X 를 만족하는 순열의 개수를 구한다. 값이 매우 커질 수 있으므로 1234567 로 나눈 나머지를 출력한다.
아래는 삽입 정렬의 의사 코드이며, 비교 횟수도 함께 센다. 감시자 A[0] = -무한대 를 둔다.
아래는 퀵 정렬의 의사 코드다. 정렬하려는 배열의 길이가 L이면 분할(partition) 과정에서 L - 1번의 비교가 일어난다.
예를 들어 순열 (3, 1, 4, 2) 를 생각하자. 삽입 정렬의 비교 횟수는 총 6회로, i=2일 때 2회, i=3일 때 1회, i=4일 때 3회의 비교가 이루어진다. 퀵 정렬의 비교 횟수는 총 4회다. 피벗이 3일 때 3회를 비교한 뒤 (1, 2) 와 (4) 로 분할되고, 이어서 (1, 2) 에서 1회의 비교가 더 일어나 총 4회가 된다.