백준 11582번: 치킨 TOP N (C++)
2023. 1. 26. 22:24ㆍ알고리즘/분할 정복, 재귀

https://www.acmicpc.net/problem/11582
11582번: 치킨 TOP N
인하대 주변 치킨칩의 맛의 정도를 측정해 수치화하는 동아리 C.T.P(Chicken Tastes Perfect)의 회장 민호는 치킨집의 맛의 수치를 감소하지 않는 순으로 정렬을 하고 싶었다. 하지만 치킨집이 너무 많
www.acmicpc.net
풀이
분할 정복 문제, 합병 정렬 알고리즘의 중간부분을 출력하는 문제.
알고리즘 수업때 수도코드 보고 구현했던 적이 있는데 막상 해보라니까 못해서 찾아봤다. 개어렵네 진짜 ㅡㅡ
내가 한 건 없고 그냥 코드 열심히 분석하면서 이해함..ㅜ
전체 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, k;
vector<int> arr;
vector<int> arr2;
void merge(int left, int right){
if ((right - left) > (N / k)) return;
int mid = (left + right) / 2;
int i = left; //왼쪽 값들의 인덱스
int j = mid + 1; //오른쪽 값들의 인덱스
int k = left; //arr2의 인덱스
while (i <= mid && j <= right) {//합병과정
if (arr[i] <= arr[j]) arr2[k++] = arr[i++];
else arr2[k++] = arr[j++];
}
int tmp = i > mid ? j : i;
while (k <= right) arr2[k++] = arr[tmp++]; //작은 값들 정렬 후 나머지 합병
for (int i = left; i <= right; i++) arr[i] = arr2[i]; //원래 정렬에 복사
}
void partition(int left, int right){
if (left < right){
int mid = (left + right) / 2;
partition(left, mid);
partition(mid + 1, right);
merge(left, right);
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> N;
for (int i = 0; i < N; i++) {
int a;
cin >> a;
arr.push_back(a);
}
arr2.resize(N);
cin >> k;
partition(0, N - 1);
for (int i = 0; i < N; i++) cout << arr2[i] << ' ';
}
'알고리즘 > 분할 정복, 재귀' 카테고리의 다른 글
백준 1992번: 쿼드트리 (C++) (0) | 2023.02.17 |
---|---|
백준 2630번: 색종이 만들기 (C++) (0) | 2023.01.26 |
백준 1780번: 종이의 개수 (C++) (0) | 2023.01.26 |
백준 24460번: 특별상이라도 받고 싶어 (C++) (0) | 2023.01.26 |