[C++]백준15903번 카드 합체 놀이

less than 1 minute read

오늘은 백준15903번 카드 합체 놀이 문제를 풀어보도록 하자.

우선순위큐로 문제를 풀어 시간복잡도를 줄일 수 있지만 그리디 방식으로 풀어보았다.

문제는 다음과 같다.

                               [접근법]

  1. 카드 값을 벡터에 저장하고 오름차순으로 정렬한다. 

  2. 0번째 + 1번째 값을 더하고 만일 1번째 값이 2번째 값보다 크면 다시 재정렬. 아니면 그냥 넘어간다.
  
  3. 왜냐면 항상 작은 값을 더해서 유지해줘야 하기 때문이다. 만일 4 2 2 1 이라는 값이 들어왔다고 하자. 
  
  오름차순을 하면 1 2 2 5 가 되고 3 3 2 5가 된다. 하지만 3 3을 더하는 것 보단 재정렬 후 ( 2 3 3 5 ) 2 3을 더하는 것이 더 값이 작다. 
                                     [코드]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	int n, m, num;
	long long result = 0;
	vector<long long>v;

	cin >> n >> m;

	for (int i = 0; i < n; i++) {
		cin >> num;
		v.push_back(num);
	}
	sort(v.begin(), v.end());

	while (m--) {
		v[0] += v[1];
		v[1] = v[0];

		if (v[1] > v[2]) {
			sort(v.begin(), v.end());
		}
	}
	for (int i = 0; i < n; i++) {
		result += v[i];
	}
	cout << result << '\n';
	return 0;
}