백준 1083번, 소트 풀이
2020. 11. 10. 22:13ㆍProblem Solving/백준
문제
풀이
그리디 문제입니다.
$ i $를 $ 1 $부터 $ N $까지 순서대로 순회하면서, $ i $번째에 가능한 수 중 가장 큰 수를 넣어야 합니다.
모든 $ i ( 1 \leq i \leq N) $에 대하여 구간 $ [i, min(i + S, N)] $에 속하는 값 중 최댓값을 $ i $번째에 가져다 놓으면 됩니다. ($ S $는 사용한만큼 감소시킴)
$ N $의 범위가 50이므로, 막구현해도 TLE가 나지는 않습니다. 다만, 탐색 범위를 한번 더 확인해서 런타임 에러를 주의할 필요는 있습니다.
소스코드
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n, s;
cin >> n;
vector<int> vec(n);
for (auto &i : vec) cin >> i;
cin >> s;
for (int i = 0; i < n && s > 0; i++) {
int mx = -1, pos = 0;
for (int j = i; j <= i + s && j < n; j++) {
if (vec[j] > mx) {
mx = vec[j];
pos = j;
}
}
for (int j = pos; j > i; j--) --s, swap(vec[j], vec[j - 1]);
}
for (const auto &i : vec) cout << i << " ";
}
'Problem Solving > 백준' 카테고리의 다른 글
백준 1240번, 노드사이의 거리 풀이 (0) | 2020.11.15 |
---|---|
백준 2110번, 공유기 설치 풀이 (0) | 2020.11.15 |
백준 1737번, Pibonacci 풀이 (0) | 2020.11.01 |
백준 16074번, Mountaineers 풀이 (0) | 2020.10.25 |
백준 9694번, 무엇을 아느냐가 아니라 누구를 아느냐가 문제다 풀이 (0) | 2020.10.16 |