function solution(orders, course) {
var answer = [];
/**set을 course 단위로 나누고, 조합들을 저장할 예정*/
var set=[];
for(var i=0;i<course.length;i++){
var temp=[];
set.push(temp);
}
for(var i=0;i<orders.length;i++){
var check=[...Array(orders[i].length)].map(()=>0); //조합을 위한 check배열
combination(orders[i],[],0);//단품 메뉴 조합
}
/*조합한 코스가 등장한 빈도수로 정렬*/
for(var i=0;i<set.length;i++){
set[i].sort((a,b)=>b.count-a.count);
}
/*1번 등장한 코스를 제거하는 동시 가장 많이 등장한 코스만 모음*/
for(var i=0;i<set.length;i++){
var max=0;
for(var j=0;j<set[i].length;j++){
if(max==0){
if(set[i][j].count==1){
break;
}else{
max=set[i][j].count;
answer.push(set[i][j].str);
}
}else{
if(set[i][j].count==max){
answer.push(set[i][j].str);
}else{
break;
}
}
}
}
/*출력 조건에 맞게 정렬**/
answer.sort();
console.log(answer);
/**단품메뉴 코스 조합하기*/
function combination(order,comb,index){
for(var n=0;n<course.length;n++){
if(comb.length==course[n]){
var str=comb.sort().join("");
var temp=set[n].find(s=>s.str==str);
if(!temp){
set[n].push({str:str,count:1,length:comb.length});
}
else{
temp.count=temp.count+1;
}
}
}
for(var i=index;i<order.length;i++){
if(check[i]==0){
check[i]=1;
combination(order,[...comb, order[i]],i);
check[i]=0;
}
}
}
return answer;
}
조합을 이용해 풀었다.
왠지 좀 더 효율적으로 풀 수 있을 것같은데.. 다른 사람의 풀이를 보며 공부해야지!
function solution(orders, course) {
const ordered = {};
const candidates = {};
const maxNum = Array(10 + 1).fill(0);
const createSet = (arr, start, len, foods) => {
if (len === 0) {
ordered[foods] = (ordered[foods] || 0) + 1;
if (ordered[foods] > 1) candidates[foods] = ordered[foods];
maxNum[foods.length] = Math.max(maxNum[foods.length], ordered[foods]);
return;
}
for (let i = start; i < arr.length; i++) {
createSet(arr, i + 1, len - 1, foods + arr[i]);
}
};
orders.forEach((od) => {
const sorted = od.split('').sort();
course.forEach((len) => {
createSet(sorted, 0, len, '');
});
});
//console.log(ordered);
//console.log("ca",candidates);
//console.log("max",maxNum);
const launched = Object.keys(candidates).filter(
(food) => maxNum[food.length] === candidates[food]
);
return launched.sort();
}