알고리즘/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] 이었다...
실수였지만, 입력 조건에 대한 차이까지 생각해보고... 나쁘지 않았다.
* 리트코드에 간단한 조건부터 시작해서 조건이 점점 복잡해지는 연관 문제가 있는데, 이건 정말 좋은 방식인 거 같음