문제풀이/백준oj

[백준OJ] 20366번 같이 눈사람 만들래?

Hyeon-Uk 2021. 9. 27. 23:57
반응형

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

 

20366번: 같이 눈사람 만들래?

높이가 (2, 5), (3, 5)로 구성된 눈사람 둘을 만드는 것이 최적의 경우 중 하나이다. |7-8| = 1 다른 경우로는 (2, 9), (5, 5)로 두 눈사람을 만드는 경우가 있다. |11-10| = 1

www.acmicpc.net


 

 

풀이

먼저 모든 눈사람의 크기를 구해준다. 2중for문을 이용하여 모든 조합을 완성 시킬 수 있다.

그런 뒤, 두 눈사람의 크기차이의 최솟값을 찾으면 되는것이기때문에 눈사람의 크기순으로 정렬을 한 뒤, 자신의 바로 뒤의 눈사람과 비교를 해서 값을 갱신시켜주면 된다. 이때 서로다른 4개의 눈덩이를 골라야하므로, 눈사람 2개를 골랐을때, 중복된 눈덩이가 있는지 확인 후, 없으면 최솟값을 갱신하면 된다.

 

코드

#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#define MAX	2000000001
using namespace std;
typedef pair<int, int> pii;
vector<pair<pii,int>> sum_v;
int n;
vector<int> arr;

bool compare(pair<pii, int> a, pair<pii, int> b) {
	return a.second < b.second;
}

int main() {
	cin >> n;
	arr.resize(n);
	for (int i = 0; i < n; i++) cin >> arr[i];

	for (int i = 0; i < n; i++) {
		for (int j = i + 1; j < n; j++) {
			sum_v.push_back({ {i,j},arr[i] + arr[j] });
		}
	}
	sort(sum_v.begin(), sum_v.end(), compare);
	int ret = MAX;
	for (int i = 0; i < sum_v.size()-1; i++) {
		for (int j = i + 1; j < sum_v.size(); j++) {
			int i1 = sum_v[i].first.first;
			int j1 = sum_v[i].first.second;
			int c1 = sum_v[i].second;

			int i2 = sum_v[j].first.first;
			int j2 = sum_v[j].first.second;
			int c2 = sum_v[j].second;

			if (i1 != i2 && i1 != j2 && j1 != i2 && j1 != j2) {
				ret = min(ret, abs(c1 - c2));
				break;
			}
		}
	}
	cout << ret;

	return 0;
}
반응형