파게로그

[백준 2751번] 수 정렬하기 2 본문

콤퓨타 왕왕기초/PS

[백준 2751번] 수 정렬하기 2

파게 2020. 11. 11. 03:24

문제 링크: 2751번 수 정렬하기 2

https://www.acmicpc.net/problem/2751

 

merge sort를 C++로 구현해 보았다.

 

#include <iostream> #include <vector> using namespace std; vector<int> sliceVector(vector<int> arr, int start, int end) { ​​​​// arr[end]는 결과에 포함되지 않는다. ​​​​// 파이썬에서 슬라이싱과 동일하게 구현했다. ​​​​vector<int> res; ​​​​for (int i=start; i<end; i++) { ​​​​​​​​res.push_back(arr[i]); ​​​​} ​​​​return res; } void printVector(vector<int> arr) { ​​​​for (int i=0; i<arr.size(); i++) { ​​​​​​​​cout << arr[i] << '\n'; ​​​​} } vector<int> merge(vector<int> left, vector<int> right) { ​​​​vector<int> res; ​​​​int i=0, j=0; ​​​​ ​​​​while((i<left.size())&&(j<right.size())) { ​​​​​​​​if (left[i]<=right[j]) { ​​​​​​​​​​​​res.push_back(left[i++]); ​​​​​​​​} else { ​​​​​​​​​​​​res.push_back(right[j++]); ​​​​​​​​} ​​​​} ​​​​while(i<left.size()) res.push_back(left[i++]); ​​​​while(j<right.size()) res.push_back(right[j++]); ​​​​return res; } vector<int> mergeSort(vector<int> arr) { ​​​​// 배열 길이가 0 또는 1이면 그대로 return ​​​​if (arr.size() <= 1) { ​​​​​​​​return arr; ​​​​} ​​​​// left와 right로 슬라이스 ​​​​vector<int> left = sliceVector(arr, 0, arr.size()/2); ​​​​vector<int> right = sliceVector(arr, arr.size()/2, arr.size()); ​​​​// left와 right를 정렬 ​​​​left = mergeSort(left); ​​​​right = mergeSort(right); // left와 right를 병합 ​​​​return merge(left, right); } vector<int> init() { ​​​​int n; cin >> n; ​​​​vector<int> arr; ​​​​for (int i=0; i<n; i++) { ​​​​​​​​int temp; cin >> temp; ​​​​​​​​arr.push_back(temp); ​​​​} ​​​​return arr; } int main(void) { ​​​​vector<int> arr = init(); ​​​​arr = mergeSort(arr); ​​​​printVector(arr); }

 

'콤퓨타 왕왕기초 > PS' 카테고리의 다른 글

[백준 10989번] 수 정렬하기 3  (0) 2020.11.12
[정렬] counting sort  (0) 2020.11.11
[백준 2750번] 수 정렬하기  (0) 2020.11.11
[정렬] quick sort  (0) 2020.11.09
[정렬] insertion sort  (0) 2020.11.09
Comments