#include <iostream> #define min(a, b) (a < b) ? a : b using namespace std; int N, S; int Arr[50]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> N; for (size_t i = 0; i < N; i++) cin >> Arr[i]; cin >> S; // 본 문제는 버블정렬을 이용하는 것이다. // 반복이 끝나는 것은 정렬이 다 되었거나, // 교환을 더 이상 할 수 없을 때다. for (size_t i = 0; i < N; i++) { // 교환을 더 할 수 없으면 반복을 종료한다. if (S == 0) break; // 현재 값을 최댓값으로 설정한다. int max = Arr[i], maxIdx = i; // 교환할 수 있는 횟수는 아래와 같다. size_t count = min(N, i + 1 + S); for (size_t j = i + 1; j < count; j++) { // 이동할 수 있는 범위에서 최댓값을 찾는다. if (max < Arr[j]) { max = Arr[j]; maxIdx = j; } } // 버블정렬은 내부 반복문을 완료할 때마다 // 가장 상위값의 자리가 고정이 된다. // 그러므로 그 값이 이동한 횟수만큼 차감한다. S -= maxIdx - i; // 값을 반영한다. for (size_t j = maxIdx; j > i; j--) Arr[j] = Arr[j - 1]; Arr[i] = max; } for (size_t i = 0; i < N; i++) cout << Arr[i] << ' '; } |