https://school.programmers.co.kr/learn/courses/30/lessons/72411
#include <string>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
void combination(set<string>& set, const string& str, string res, int r, int next) {
if (res.length() == r) {
set.insert(res);
return;
}
for (int i = next; i < str.length(); i++) {
res += str[i];
combination(set, str, res, r, i + 1);
res.pop_back();
}
}
vector<string> solution(vector<string> orders, vector<int> course) {
vector<string> answer;
// course의 값 순대로 알파벳에 대한 모든 조합을 구한다.
// 구해진 조합을 알파벳 순으로 정렬하고 그 개수를 보관한다. (매번 최대 개수와 비교해서 갱신)
for (const auto& combi : course)
{
set<string> set; // 중복 단어 필터링하기 위해 set 사용
// course에 맞게 단어 조합
for (auto& str : orders)
{
::sort(str.begin(), str.end());
combination(set, str, "", combi, 0);
}
size_t maxCnt = 0;
vector<string> temp;
// 조합된 단어가 orders에 2개 이상있는지 체크
for (auto combiStr : set)
{
size_t cnt = 0;
for (const auto& str : orders)
{
bool check = true;
for (const auto& word : combiStr)
{
if (str.find(word) == std::string::npos) {
check = false;
break;
}
}
if (check) ++cnt;
}
if (cnt >= 2 && maxCnt <= cnt)
{
if (maxCnt < cnt)
maxCnt = cnt, temp.clear();
temp.emplace_back(combiStr);
}
}
answer.insert(answer.end(), temp.begin(), temp.end());
}
::sort(answer.begin(), answer.end());
return answer;
}
'Coding Test > Programmers' 카테고리의 다른 글
[Programmers] (2018 KAKAO BLIND RECRUITMENT) Lv 2. [3차] 방금그곡 (0) | 2023.08.07 |
---|---|
[Programmers] Lv 2. 무인도 여행 (1) | 2023.08.05 |
[Programmers] (2022 KAKAO TECH INTERNSHIP) Lv 2. 두 큐 합 같게 만들기 (0) | 2023.08.01 |
[Programmers] [투포인터] Lv 2. 연속된 부분 수열의 합 (0) | 2023.07.31 |
[Programmers] Lv 2. 124 나라의 숫자 (0) | 2023.07.28 |
댓글