72411. 메뉴 리뉴얼
2025-12-04
프로그래머스 72411번 풀이
이 글은 Obsidian에서 마이그레이션되었으며, 그 과정에서 AI의 도움을 받았습니다. 오류나 누락된 내용이 있다면 댓글로 알려주세요!
문제
풀이
아이디어
각 코스 개수별로 가장 많이 주문된 조합을 찾아야 한다. 각 주문에서 가능한 모든 조합을 생성하고 그 조합들의 등장 횟수를 세어주는 방식으로 풀었다.
1단계: 조합 생성 함수 구현
주문 내역에서 특정 개수만큼의 메뉴 조합을 뽑아야 하기 때문에 백트래킹으로 조합을 생성하는 함수를 만들었다.
function getCombinations(arr, cnt) {
const result = [];
function backtrack(start, curr) {
if (curr.length === cnt) {
result.push(curr.join(""));
return;
}
for (let idx = start; idx < arr.length; idx++) {
curr.push(arr[idx]);
backtrack(idx + 1, curr);
curr.pop();
}
}
backtrack(0, []);
return result;
}2단계: 조합별 등장 횟수 카운트
각 코스 개수에 대해서 모든 주문에서 조합을 생성하고, Map에다 조합 개수와 등장 횟수를 저장해줬다.
for (const cnt of course) {
// 주문에서 나온 조합들 구하기
const combMap = new Map();
for (const order of orders) {
const sortedOrder = order.split("").sort();
const combs = getCombinations(sortedOrder, cnt);
combs.forEach((comb) => {
if (combMap.has(comb)) {
combMap.set(comb, combMap.get(comb) + 1);
} else {
combMap.set(comb, 1);
}
});
}
// ...
}3단계: 최대 등장 조합 선택
각 코스 개수별로 가장 많이 등장한 조합을 찾는다. 만약 최대 등장 횟수가 2보다 작으면 조건을 만족하지 않기 때문에 건너뛴다.
// 최대 주문 조합 구하기
const max = Math.max(...combMap.values());
if (max < 2) continue;
combMap.forEach((count, comb) => {
if (count === max) answer.push(comb);
});