알고리즘/softeer

Softeer - 마이크로서버

유이얼 2022. 3. 27. 16:53

https://softeer.ai/practice/info.do?eventIdx=1&psProblemId=628

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <algorithm>


using namespace std;

const int MAX = 900;
const int MIN = 300;

int solve() {
	int N;
	cin >> N;

	int total = 0;
	int answer = 0;
	vector<int> in(MAX + 1);

	for (int i = 0; i < N; ++i) {
		int t;
		cin >> t;

		total += t;
		if (t > MAX - MIN) {
			answer++;
			continue;
		}

		in[t]++;
	}

	for (int i = MAX - MIN; i >= MIN; --i) {
		if (total == 0) return answer;
		if (in[i] == 0) continue;

		while (in[i]--) {
			int c = MAX - i;
			total -= i;

			for (int j = min(i, c); j >= MIN; --j) {
				if (c < MIN) break;
				if (in[j] == 0) continue;

				int q = min(c / j, in[j]);
				in[j] -= q;
				c -= j * q;
				total -= j * q;
			}

			answer++;
		}
	}

	return answer;
}

int main() {
	int T;
	cin >> T;
	for (int i = 0; i < T; ++i) {
		cout << solve() << "\n";
	}
	
	return 0;
}

입력값 범위가 [1 <= in <= 900] 일 거라 생각했는데 [300 <= in <= 900] 이었다...

실수였지만, 입력 조건에 대한 차이까지 생각해보고... 나쁘지 않았다.

* 리트코드에 간단한 조건부터 시작해서 조건이 점점 복잡해지는 연관 문제가 있는데, 이건 정말 좋은 방식인 거 같음