문제 링크: https://www.acmicpc.net/problem/1083

 

버블소트를 약간 응용하는 문제입니다. swap 할 수 있는 횟수가 정해져 있는데요, 이 부분을 처리해줘야 합니다.

맨 앞자리부터 이 자리에 어떤 값을 올릴 수 있을지, swap 횟수가 되는 동안 옮길 수 있는 가장 큰 값을 골라서 앞으로 옮깁니다.

정렬이 다 되거나, swap 횟수가 다 떨어지면 정렬된 배열을 출력하면 됩니다.

 

옛날엔 문제에 명시는 되어있지 않은데, 테스트케이스가 여러개 들어올 수 있었다고 합니다.

지금은 테스트케이스가 쪼개져있어서 처리 안해줘도 됩니다.

#include <bits/stdc++.h>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);
	
	int n;
	cin >> n;
	
	vector<int> v(n);
	for (auto& c : v)
		cin >> c;

	int s;
	cin >> s;

	int mx, idx;
	for (int i=0; i<n && s; ++i) {
		mx = idx = -1;
		for (int j=i, k=0; j<n && k<=s; ++j, ++k)
			if (mx < v[j]) {
				mx = v[j];
				idx = j;
			}

		for (int j=idx; j>i && s; --j, --s)
			swap(v[j], v[j - 1]);
	}

	for (auto& c : v)
		cout << c << ' ';
	cout << '\n';

	return 0;
}
반응형

'Online Judge > 백준' 카테고리의 다른 글

[백준][C++] 14719: 빗물  (2) 2020.09.19
[백준][C++] 17419: 비트가 넘쳐흘러  (0) 2020.08.30
[백준][C++] 1083: 소트  (0) 2020.08.29
[백준][C++] 3300: 무어 기계  (0) 2020.08.28
[백준][C++] 7595: Triangles  (0) 2020.08.27
[백준][C++] 9296: Grading Exams  (0) 2020.08.26