SWEA-D3-1208 Flatten

Seok·2020년 12월 6일
0

Algorithm

목록 보기
16/60

첫 번째 방법

필요한 지식

  1. Multiset

접근

  1. 최대를 바로 확인할수 있는 SET하나 최소를 바로 확인할 수 있는 SET하나를 가지고 있는다.(원소가 중복될 수 있으므로 Multiset 을 사용)

  2. 평탄화를 더이상 진행할 수 없을 조건을 검사해주고 평탄화를 계속 반복한다.

  3. 평탄화 작업은 첫번째 원소를 erase, insert 해주며 쉽게 처리할 수 있다.

코드(C++)

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

int main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	for (int t = 1; t <= 10; t++) {
		multiset<int>s, e;//최소 최대
		int n; cin >> n;
		for (int i = 0; i < 100; i++) {
			int x; cin >> x;
			s.insert(x); e.insert(-x);
		}
		while (n--) {
			if (-*e.begin() - *s.begin() <= 1) break;
			int tmp = *e.begin();
			e.erase(e.begin());
			e.insert(tmp + 1);
			tmp = *s.begin();
			s.erase(s.begin());
			s.insert(tmp + 1);
		}
		cout << "#" << t << " " << -*e.begin() - *s.begin() << "\n";
	}
	return 0;
}

두번째 방법

필요한 지식

  1. sort

접근

  1. 평탄화 할때마다 sort()로 정렬을 해준다.

코드(C++)

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

int main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	for (int t = 1; t <= 10; t++) {
		vector<int> v;
		int n; cin >> n;
		for (int i = 0; i < 100; i++) {
			int x; cin >> x;
			v.push_back(x);
		}
		sort(v.begin(), v.end());
		while (n--) {
			if (*v.rbegin() - *v.begin() <= 1) break;
			*v.rbegin() -= 1;
			*v.begin() += 1;
			sort(v.begin(), v.end());
		}
		cout << "#" << t << " " << *v.rbegin() - *v.begin() << "\n";
	}
	return 0;
}

위(multiSet), 아래(sort)

image

profile
🦉🦉🦉🦉🦉

0개의 댓글