-
백준 1517번 버블소트PS 2021. 4. 23. 23:08
1517번: 버블 소트
첫째 줄에 N(1≤N≤500,000)이 주어진다. 다음 줄에는 N개의 정수로 A[1], A[2], …, A[N]이 주어진다. 각각의 A[i]는 0≤|A[i]|≤1,000,000,000의 범위에 들어있다.
www.acmicpc.net
<접근방법>
버블소트는 왼쪽에서 오른쪽으로 이동하며 숫자의 위치를 결정한다.
이를 버블소트 그대로 구현하면 문제의 시간조건에 걸린다.
따라서 머지소트로 정렬하며 이동횟수를 세어준다.
왼쪽 배열과 오른쪽 배열을 병합하는 과정에서
오른쪽 배열의 숫자가 선택되어 sorted 배열에 포함된다는 것은
아직 선택되지 않은 왼쪽 배열의 숫자의 갯수만큼 이동한다는 뜻이다.
이를 카운팅한다.
<코드>
#include <iostream> #include <algorithm> using namespace std; int n; int a[500005]; int b[500005]; long long res; void merge(int left, int right) { int mid = (left + right) / 2; int i = left; int j = mid + 1; int k = left; while (i <= mid && j <= right) { if (a[i] <= a[j]) { b[k++] = a[i++]; } else { res += (mid - i + 1); b[k++] = a[j++]; } } while (i <= mid) { b[k++] = a[i++]; } while (j <= right) { b[k++] = a[j++]; } for (int p = left; p <= right; p++) { a[p] = b[p]; } } void divide(int left, int right) { int mid = (left + right) / 2; if (left < right) { divide(left, mid); divide(mid + 1, right); merge(left, right); } } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; } divide(1, n); cout << res << '\n'; return 0; }
반응형'PS' 카테고리의 다른 글
백준 2448 별 찍기-11 (0) 2021.04.23 백준 2447번 별 찍기 - 10 (0) 2021.04.16 백준 1030번 프렉탈 평면 (0) 2021.04.14 백준 1725번 히스토그램 (0) 2021.04.14 백준 2104번 부분배열 고르기 (0) 2021.04.14