프로그래머스

메뉴 리뉴얼 C++

paysmile 2021. 6. 30. 21:46

 

https://programmers.co.kr/learn/courses/30/lessons/72411

 

코딩테스트 연습 - 메뉴 리뉴얼

레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서

programmers.co.kr

 

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

using namespace std;
map<string, int> m;
int sz;

bool cmp(pair<string, int> a, pair<string, int> b) {
	return a.second > b.second;
}

void find_menu(int count, string str, int index, string tmp) {
	if (count < sz) {
		for (; index <str.size(); index++) {
			find_menu(count + 1, str, index+1, tmp + str[index]);
		}
	}
	else if (count == sz) {
		m[tmp] += 1;
	}
}

vector<string> solution(vector<string> orders, vector<int> course) {
	vector<string> answer;

	for (int i = 0; i<course.size(); i++) {
		m.clear();
		sz = course[i];

		for (int j = 0; j<orders.size(); j++) {
			sort(orders[j].begin(), orders[j].end());
			find_menu(0, orders[j], 0, "");
		}

		vector<pair<string, int>> v(m.begin(), m.end());

		sort(v.begin(), v.end(), cmp);

		if (!v.empty()) {
			int biggest = v[0].second;

			if (biggest >= 2) {
				for (int j = 0; j<v.size(); j++) {
					if (v[j].second == biggest)
						answer.push_back(v[j].first);
				}
			}
		}
	}

	sort(answer.begin(), answer.end());
	return answer;
}