티스토리 뷰

문제풀이

프로그래머스 메뉴리뉴얼 js

수박수박좋다 2021. 5. 19. 21:48
반응형

프로그래머스 메뉴리뉴얼


손님들이 주문한 메뉴들 중 2개 이상의 조합을 찾아내어

손님들이 공통적으로 가장 많이 주문한 메뉴의 구성을 찾아내는 문제인데,

주어지는 course의 각 숫자만큼의 메뉴 갯수를 찾아내는 것

예를들어 3명의 손님이 각각

A, B, C

B, C ,D

A, B, F 를 주문했고 파라미터로 [2,3,4]가 들어왔을 때의 경우

메뉴 2개의 조합에서 가장 많이 주문 된 것은 A,B가 2번,

3개 조합에서는 없고, 4개도 마찬가지로 없어서 리턴되야할 것은 ["AB"]

들어오는 파라미터의 각 숫자만큼 조합을 구해야했다.

손님이 주문한 메뉴를 각 파라미터의 갯수만큼 숫자를 올리면서 조합을 구하고 난 다음,

메뉴 갯수에서 가장 많이 주문한 갯수를 찾기 위해 메뉴당 max값을 구했다.

최종적으로 max에 해당하는 메뉴의 이름을 구하고 이를 알파벳순으로 정렬하고 반환했다.

function getCombi(arr, sn) {
  const result = [];
  if (sn === 1) {
    return arr.map((v) => [v]);
  }
  arr.forEach((fixed, index, origin) => {
    const rest = origin.slice(index + 1);
    const combis = getCombi(rest, sn - 1);
    const att = combis.map((combi) => [fixed, ...combi]);
    result.push(...att);
  });
  return result;
}

function solution(orders, course) {
  let candidate = [];
  let map = new Map();
  for(let i = 0; i < orders.length; i++){
    let splited = orders[i].split('').sort();
    for(let co of course){
      candidate = getCombi(splited, co);
      for(let set of candidate){
        if(!map.has(set.join(''))){
          map.set(set.join(''), 1);
        } else{
          map.set(set.join(''), map.get(set.join('')) + 1);
        }
      }
    }
  }
  let filtered = [...map].filter((v) => v[1] > 1);
  let max = new Map();
  for(let i = 0; i < filtered.length; i++){
    if(!max.has(filtered[i][0].length)){
      max.set(filtered[i][0].length, filtered[i][1]);
    }
    if(max.get(filtered[i][0].length) < filtered[i][1]){
      max.set(filtered[i][0].length, filtered[i][1]);
    }
  }
  console.log(map)
  let answer = [];
  for(let v of filtered){
    if(v[1] === max.get(v[0].length)){
      answer.push(v[0]);
    }
  }
  return answer.sort()
}

// console.log(solution(["ABCFG", "AC", "CDE", "ACDE", "BCFG", "ACDEH"],[2,3,4]));
console.log(solution(["XYZ", "XWY", "WXA"],[2,3,4]));
반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
농담곰의 고군분투 개발기