티스토리 뷰
반응형
프로그래머스 메뉴리뉴얼
손님들이 주문한 메뉴들 중 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]));
반응형
'문제풀이' 카테고리의 다른 글
백준 2638 치즈 (dfs + bfs) (0) | 2021.07.12 |
---|---|
백준 다리만들기 (dfs + bfs) (0) | 2021.07.12 |
프로그래머스 타겟넘버 js (0) | 2021.05.19 |
프로그래머스 짝지어제거하기 js (0) | 2021.05.19 |
프로그래머스 뉴스클러스터링 js (0) | 2021.05.19 |
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
농담곰의 고군분투 개발기