🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/72411
✏️ 풀이
function solution(orders, course) {
// orders를 순회하면서 코스요리 메뉴 후보 정보를 저장할 객체
const candidates = {};
// 주문과 코스요리의 메뉴 개수가 주어지면
// candidates에 현재 주문에서 만들 수 있는 모든 코스요리에 대해 주문 수를 갱신
const dfs = (order, maxLength, candidate = '') => {
if (candidate.length === maxLength) {
candidates[candidate] = (candidates[candidate] ?? 0) + 1;
} else {
for (const menu of order) {
if (candidate.includes(menu) || candidate[candidate.length - 1] > menu) {
continue;
}
dfs(order, maxLength, candidate + menu);
}
}
};
// 주문과 코스요리의 메뉴 개수를 순회하면서 dfs 실행
for (const order of orders) {
for (const courseLength of course) {
if (order.length < courseLength) {
break;
}
dfs([...order].sort().join(''), courseLength);
}
}
const entries = Object.entries(candidates);
return course
.reduce((acc, courseLength) => {
// 동일한 메뉴 개수를 가진 코스요리들
const sameLengthCourse = entries.filter(([key]) => key.length === courseLength);
// 동일한 메뉴 개수를 가진 코스요리들이 하나도 없으면 패스
if (!sameLengthCourse.length) {
return acc;
}
// 동일한 메뉴 개수를 가진 코스요리들 중 가장 많은 주문 수
const maxOrderCount = sameLengthCourse.sort((a, b) => b[1] - a[1])[0][1];
// 가장 많은 주문 수가 2 미만이면 패스
if (maxOrderCount < 2) {
return acc;
}
// 동일한 메뉴 개수를 가진 코스요리들 중 가장 많이 주문되었으며,
// 주문 수가 2 이상인 코스요리들은 acc에 추가
sameLengthCourse
.filter(([, value]) => value === maxOrderCount)
.forEach(([key]) => acc.push(key));
return acc;
}, [])
.sort();
}
'연습장 > 프로그래머스 문제풀이' 카테고리의 다른 글
[프로그래머스 Level 2] 수식 최대화 - JavaScript (0) | 2022.09.16 |
---|---|
[프로그래머스 Level 2] 괄호 변환 - JavaScript (0) | 2022.09.15 |
[프로그래머스 Level 2] 튜플 - JavaScript (0) | 2022.09.15 |
[프로그래머스 Level 2] 주차 요금 계산 - JavaScript (0) | 2022.09.15 |
[프로그래머스 Level 2] 타겟 넘버 - JavaScript (0) | 2022.07.04 |