매일매일 코테풀기 (일시 중단!)
(2024-10-28) 2 문제 : 백준 - 14718 (용감한 용사 진수)
오의현
2024. 10. 28. 18:54

병사의 수가 100개밖에 되지 않기 때문에 가능한 모든 조합을 구해도 시간초과가 발생하지 않는다.
단순하게 3중반복문을 통해 모든 힘, 민첩, 지능의 조합을 구한 뒤, 그 조합으로 이길 수 있는 병사의 수가 몇명이 되는지 개수를 세어 K를 넘는지 확인하면 된다. (K를 넘을 시, 합의 최소값을 갱신)
총 4중 반복문을 무식하게 돌려주면 되고, 최악의 경우에 1억번의 연산이 발생하지만 다행히 시간 초과는 발생하지 않는다.
#include <iostream>
#include <vector>
#include <algorithm>
void Init()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
}
struct Stat
{
int Str = 0;
int Dex = 0;
int Int = 0;
};
std::vector<Stat> SoldierStats;
int main()
{
Init();
int NumSoldier = 0, NeedWin = 0;
std::cin >> NumSoldier >> NeedWin;
SoldierStats.resize(NumSoldier);
for (int i = 0; i < NumSoldier; i++)
{
std::cin >> SoldierStats[i].Str >> SoldierStats[i].Dex >> SoldierStats[i].Int;
}
int Answer = 100000000;
for (int i = 0; i < NumSoldier; i++)
{
for (int j = 0; j < NumSoldier; j++)
{
for (int k = 0; k < NumSoldier; k++)
{
int CurStr = SoldierStats[i].Str;
int CurDex = SoldierStats[j].Dex;
int CurInt = SoldierStats[k].Int;
int Count = 0;
for (int l = 0; l < NumSoldier; l++)
{
if (SoldierStats[l].Str <= CurStr && SoldierStats[l].Dex <= CurDex && SoldierStats[l].Int <= CurInt)
{
Count++;
}
if (Count >= NeedWin)
{
Answer = std::min(Answer, CurStr + CurDex + CurInt);
break;
}
}
}
}
}
std::cout << Answer;
return 0;
}