๐๋ฌธ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๐จ๐ปํ์ด ๊ณผ์
์ญ์ ์ฌ๋์ ์ ์ ์ ์๊ณ , ๋ฐฅ ๋จน๊ณ , ์ปคํผ ํ ์ ๋ง์๋ฉด์ ์งํํด์ผ ๋ฅ๋ฅ ์ด ์ข๋ ๋ด ๋๋ค. ์ ๋ฒ์ ํ ๋ ๋จธ๋ฆฌ๊ฐ ์ ๋์๊ฐ์ ๊ทธ๋ฅ ์๊ฐ๋ง ๋ณด๋ด๊ณ ์์๋๋ฐ, ์ด๋ฒ์ ์นดํ์ ์์ ์ ์ ์ปจ๋์ ์ผ๋ก ํธ๋๊น ๊ธ๋ฐฉ ํ์๋ค์.
ํ๋งคํ๋ ์ด๋ชจํฐ์ฝ์ ์ต๋ ๊ฐ์๋ 7๊ฐ์ด๊ณ , ํ ์ธ์ 40%, 30%, 20%, 10% ์ด๋ ๊ฒ 4๊ฐ์ง ๋ฟ์ด๋ฏ๋ก ์ต์ ์ผ ๋์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ \( 4 ^ 7 = 16,384 \) ๊ฐ์ง์ ๋๋ค. ์ ์ ์ ์ต๋ ์๊ฐ 100๋ช ์ด๋ฏ๋ก \( 100 \times 7 \times 16,384 \) ๋ฒ์ ์ฐ์ฐ์ด ์ผ์ด๋ฉ๋๋ค. ์ด๋ 1์ต๋ณด๋ค ์์ผ๋ฏ๋ก ์ถฉ๋ถํ ๊ฐ๋ฅํ๊ฒ ๋ค์.
๊ทธ๋์ ์ ๋ ๋ฐฑํธ๋ํน(Backtracking)์ผ๋ก ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ฒ์ฌํ์ฌ, ๋ฌธ์ ์์ ์ ์ํ 1. ๊ฐ์ ์ ์ ์ต๋, 2. ํ๋งค์ก ์ต๋์ผ ๋ ๋ต์ ๊ฐฑ์ ํ๋ ํํ๋ก ์ฝ๋๋ฅผ ์์ฑํ์์ต๋๋ค.
โ๏ธ์์ค ์ฝ๋ ๋ฐ ๊ฒฐ๊ณผ
#include <string>
#include <vector>
using namespace std;
using User = vector<vector<int>>;
vector<int> discountRates = { 40, 30, 20, 10 };
struct Emoticon {
Emoticon() { }
Emoticon(int originalPrice, int discountRate) : _discountRate(discountRate) {
_price = originalPrice * (1.0f - (static_cast<float>(discountRate) * 0.01f));
}
int _price;
int _discountRate;
};
void Search(const User& users, const vector<int>& emoticons, vector<Emoticon>& discountedEmoticons, vector<int>& answers, int emoticonIdx) {
if (discountedEmoticons.size() == emoticons.size()) {
int totalBuyingPrice = 0;
int member = 0;
for (const auto& user : users) {
int requireDiscountRate = user[0];
int membershipStandardPrice = user[1];
int buying = 0;
for (const auto& emoticon : discountedEmoticons) {
if (emoticon._discountRate < requireDiscountRate)
continue;
buying += emoticon._price;
if (buying >= membershipStandardPrice) {
member++;
break;
}
}
totalBuyingPrice += (buying < membershipStandardPrice) ? buying : 0;
}
if (answers[0] == member and answers[1] < totalBuyingPrice)
answers[1] = totalBuyingPrice;
else if (answers[0] < member) {
answers[0] = member;
answers[1] = totalBuyingPrice;
}
return;
}
for (int ei = emoticonIdx; ei < emoticons.size(); ei++) {
for (int di = 0; di < discountRates.size(); di++) {
discountedEmoticons.emplace_back(Emoticon(emoticons[ei], discountRates[di]));
Search(users, emoticons, discountedEmoticons, answers, ei + 1);
discountedEmoticons.pop_back();
}
}
}
vector<int> solution(vector<vector<int>> users, vector<int> emoticons) {
vector<int> answers { 0, 0 };
vector<Emoticon> discountedEmoticons;
Search(users, emoticons, discountedEmoticons, answers, 0);
return answers;
}
'๐คAlgorithm > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Programmers] Lv2. ์นด์นด์คํ๋ ์ฆ ์ปฌ๋ฌ๋ง๋ถ | C++ (0) | 2023.07.13 |
---|---|
[Programmers] Lv2. ์์ ๊ฒ์ | C++ (0) | 2023.07.10 |
[Programmers] Lv2. ์๊ฒฉ ์์คํ | C++ (0) | 2023.07.06 |
[Programmers] Lv2. ํผ์์ ํ๋ ํฑํํ | C++ (0) | 2023.07.05 |
[Programmers] Lv2. ์ซ์ ๋ธ๋ก | C++ (0) | 2023.07.04 |