정렬
시간 제한0.3초메모리 제한64 MB
순열이 주어질 때, i번째와 i+X번째 원소를 교환하는 패스를 더 이상 교환이 없을 때까지 반복하는 과정이 배열을 오름차순으로 정렬하는 모든 간격 X를 구한다.
문제
어린 P는 셸 정렬(shell sort) 알고리즘을 막 배웠다. 그는 개의 정수로 이루어진 배열을 오름차순으로 정렬하려는 코드를 작성했다. 정렬할 배열을 라고 하자.
gap = X;
do
{ ok = 1;
for (i = 1; i<= N - gap; i++)
if (A[i] > A[i+gap])
{ temp = A[i];
A[i] = A[i+gap];
A[i+gap] = temp;
ok = 0;
}
if (gap/2 > 1) gap=gap/2; else gap=1;
} while (ok == 0);
여기서 i, N, X, gap, temp, ok는 모두 정수이다(C/C++의 int 타입).
그런데 코드를 입력하던 중 어린 P는 11번째 줄(if (gap/2 > 1) gap=gap/2; else gap=1;)을 빠뜨리고 말았다. 이 줄이 없으므로 gap은 절대 줄어들지 않고 처음 값 X를 그대로 유지하며, 반복문은 한 번의 패스에서 교환이 한 번도 일어나지 않을 때까지 같은 간격의 패스를 계속 반복한다.
정렬할 배열 가 주어진다. 의 원소 개는 모두 서로 다르며, 각각 이상 이하이다.
11번째 줄이 빠진 이 알고리즘이 그래도 를 올바르게 정렬하는 모든 값을 구하여라. 이러한 값을 유효한(valid) 값이라고 부른다.
입력
첫째 줄에 정수 이 주어진다.
둘째 줄에 배열 를 나타내는 개의 정수가 공백 하나로 구분되어 주어진다.
출력
첫째 줄에 유효한 값의 개수를 출력한다.
둘째 줄에 유효한 모든 값을 오름차순으로 공백 하나로 구분하여 출력한다.
제한
- 는 의 순열이다(모든 원소가 서로 다르다).
힌트
예를 들어 , 인 경우 유효한 값은 다음과 같다.
- : 다음 위치 쌍에서 교환이 일어난다 — .
- : 다음 위치 쌍에서 교환이 일어난다 — .