programmers 메뉴 리뉴얼 ( 카카오 2021 기출) javascript

밍디·2021년 10월 27일
0
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();
}
profile
노후를 위해 꾸준히 공부하자.

0개의 댓글