버블 정렬
시간 제한1초메모리 제한128 MB
배열에서 한 쌍의 원소를 정확히 한 번 교환한 뒤, 주어진 버블 정렬이 수행하는 교환 횟수의 최솟값을 구한다.
문제
버블 정렬은 아래 의사 코드로 표현되는 가장 단순한 정렬 알고리즘 중 하나이다. 이 코드에서는 이웃한 두 원소의 순서가 잘못되어 서로 맞바꿀 때마다 교환 횟수가 1씩 증가한다.
void bubble_sort(int *a, int n) {
int i, j;
for (i = 0; i < n - 1; ++i) {
for (j = 0; j < n - 1; ++j) {
if (a[j] > a[j + 1]) {
/* 순서가 잘못된 쌍이므로 두 원소를 맞바꾼다. */
/* 이때 교환 횟수가 1 증가한다. */
int x = a[j];
a[j] = a[j + 1];
a[j + 1] = x;
}
}
}
}
길이가 인 배열 가 주어졌을 때, 배열 를 다음과 같이 정의한다. 두 인덱스 , ()를 골라 의 번째 원소와 번째 원소를 정확히 한 번 맞바꾼 배열이 이다.
가능한 모든 중에서, 위 버블 정렬을 수행했을 때의 교환 횟수가 가장 작은 값을 출력하라.
입력
첫째 줄에 정수 이 주어진다. 이어지는 개의 줄에 배열 의 원소가 순서로 한 줄에 하나씩 주어진다.
출력
모든 중 버블 정렬 교환 횟수가 최소가 되는 값을 한 줄에 출력한다.