메뉴 리뉴얼

도경원·2023년 7월 16일
0

알고리즘스터디_C++

목록 보기
41/42

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

#include <iostream>
#include <unordered_map>
#include <vector>
#include <algorithm>

using namespace std;

// orders 배열의 각 원소는 크기가 2이상 10 이하인 문자열  -> 음식을 10개 초과로 시킬 수 없음

// index 는 음식의 수를 말함
// combination[3] -> 3가지로 만들 수 있는 조합
unordered_map<string, int> combination[11]; // 음식이름 , 횟수

int mxCount[11];

void comb(string str, int cnt, string result) {
	if (cnt == str.size()) {
		// num : 메뉴개수
		// result : 메뉴조합
		
		// 최대인지 확인
		int num = result.size();
		combination[num][result]++;

		mxCount[num] = max(mxCount[num], combination[num][result]);
		return;
	}

	// 조합
	// 해당 문자 선택함
	// 해당 문자 선택하지 않음
	comb(str, cnt + 1, result + str[cnt]);
	comb(str, cnt + 1, result);
}

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

	for (auto order : orders) {
		// 조합 만들 때도 오름차순으로 만들어야 함
		sort(order.begin(), order.end());
		comb(order, 0, "");
	}

	// course 에 맞는 것을 뽑아서 넣음
	// 2명 이상의 손님이 시켜야 함
	for (auto num: course){
		for (auto x : combination[num]) {
			if (x.second == mxCount[num] && x.second >= 2) {
				answer.push_back(x.first);
			}
		}
	}

	// 결과도 오름차순 정렬
	sort(answer.begin(), answer.end());
	return answer;
}

문제가 쉽지 않아서 다른 사람의 풀이를 참고했다
unordered map로 배열을 만드는 개념이 낯설어서 처음 이해하는 데 시간이 좀 걸렸다

map 배열


// index 는 음식의 수를 말함
// combination[3] -> 3가지로 만들 수 있는 조합
unordered_map<string, int> combination[11]; // 음식이름 , 횟수

이 문제에서 핵심적인 부분이다



조합을 만들어 내는 방법

// 조합
	// 해당 문자 선택함
	// 해당 문자 선택하지 않음
	comb(str, cnt + 1, result + str[cnt]);
	comb(str, cnt + 1, result);

넣는 경우 넣지 않는 경우를 재귀를 돌면서 글자수를 완성시킨다

if (cnt == str.size())
{
		// num : 메뉴개수
		// result : 메뉴조합
		
		// 최대인지 확인
		int num = result.size();
		combination[num][result]++;

		mxCount[num] = max(mxCount[num], combination[num][result]);
		return;
}
    
  1. cnt를 통해 글자수 끝까지 탐색하며 끝에 도착했는지 계산하고
  2. 그 결과로 얻어진 글자 수를 기반으로 해당 글자수의 글자만 모아놓은 맵에서
  3. 해당글자를 key로 값을 증가시킨다
  4. 해당글자수의 글자들 중에 가장 많이 등장한 횟수를 증가시킨다




코스별 최대요소 등장 메뉴조합 뽑기

// course 에 맞는 것을 뽑아서 넣음
	// 2명 이상의 손님이 시켜야 함
	for (auto num: course){
		for (auto x : combination[num]) {
			if (x.second == mxCount[num] && x.second >= 2) {
				answer.push_back(x.first);
			}
		}
	}

combination[num]은 num 만큼의 글자수로 이뤄진 글자 맵을 가져온다
그 요소 중에 해당 요소의 mx값을 저장해놓은 배열의 값과 일치하는 요소를 가져온다

iterator로 접근하기 때문에 pair형태로 하나씩 접근하여 x.first / x.second로 접근가능하다

profile
DigitalArtDeveloper

1개의 댓글

comment-user-thumbnail
2023년 7월 17일

저도 개발자인데 같이 교류 많이 해봐요 ㅎㅎ! 서로 화이팅합시다!

답글 달기