본문 바로가기

알고리즘

[백준] 25945번 컨테이너 재배치 C++ 문제풀이

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

 

25945번: 컨테이너 재배치

항구의 컨테이너 하치장 바닥에는 컨테이너를 쌓을 수 있는 칸이 일렬로 총 $n$개가 그려져 있고, 현재 하치장에는 총 $m$개의 컨테이너가 쌓여 있다. 개별 컨테이너의 높이는 모두 $1$로 동일하며

www.acmicpc.net

 

문제 풀이

컨테이너의 높이 차이가 1까지 허용되기 때문에 평균 값을 중심으로 컨테이너를 재배치 해야겠다고 생각했다.

값들을 저장한 뒤 내림차순으로 정렬하고 정렬한 숫자에서 합을 n으로 나눈 뒤 나머지 만큼의 컨테이너는 1개가 더 쌓여있을 것이기 때문에  컨테이너를 빼냈다.

평균 컨테이너수보다 적거나 같은 컨테이너들은 앞쪽에서 빼낸 컨테이너들을.채워 넣는 것이기 때문에 break를 시켜줬다.

소스 코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<long long> container;

bool compare(long long a, long long b) {
	return a > b;
}

int main() {
	int n;
	long long sum = 0;
	cin >> n;
	for (int i = 0; i < n; i++) {
		long long a;
		cin >> a;
		container.push_back(a);
		sum += container[i];
	}
	sort(container.begin(), container.end(), compare);
	
	long long avg = sum / n;
	long long dis_cnt = sum % n;

	long long result = 0;
	for (auto x : container) {
		if (x <= avg) {
			break;
		}

		if (dis_cnt != 0) {
			result += abs(avg + 1 - x);
			dis_cnt -= 1;
		}
		else {
			result += abs(avg - x);
		}
	}
	cout << result << '\n';
}