Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions Programmers/Level2/17684_[3차]_압축.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
⭐️ 문제 정보 ⭐️
문제 : 17684 - [3차] 압축
레벨 : Level 2
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/17684
*/

function solution(msg) {
const answer = [];
// 1. 길이가 1인 모든 단어를 포함하도록 사전을 초기화
const dict = new Map();
const CAPITAL_A = 65;
for (let i = 0; i < 26; i++) {
dict.set(String.fromCharCode(CAPITAL_A + i), i + 1);
}
// msg 압축
let cursor = 0;
while (cursor < msg.length) {
// 2. 사전에서 현재 입력과 일치하는 가장 긴 문자열 w 찾기
let offset = 1;
while (
cursor + offset <= msg.length &&
dict.has(msg.slice(cursor, cursor + offset))
) {
offset++;
}
const w = msg.slice(cursor, cursor + offset - 1);
// 3. w에 해당하는 사전의 색인 번호 출력
answer.push(dict.get(w));
// 4. 입력에서 처리되지 않은 다음 글자가 남아 있다면 (c) w+c에 해당하는 단어를 사전에 등록한다. (인덱스는 사전의 가장 마지막 인덱스)
if (cursor + offset - 1 < msg.length) {
const c = msg[cursor + offset - 1];
dict.set(w + c, dict.size + 1);
}
// 5. 입력에서 w 제거
cursor = cursor + offset - 1;
}
return answer;
}
23 changes: 23 additions & 0 deletions Programmers/Level2/42578_의상.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/*
⭐️ 문제 정보 ⭐️
문제 : 42578 - 의상
레벨 : Level 2
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/42578
*/

function solution(clothes) {
const closet = new Map(); // key: 의상의 종류, value: 의상 이름이 담긴 배열;
for (const cloth of clothes) {
const [name, type] = cloth;
if (closet.has(type)) {
closet.get(type).push(name);
} else {
closet.set(type, [name]);
}
}

// 해당 타입을 안입는 경우까지 포함한 조합의 경우의 수 구함 - 아무것도 입지 않는 경우의 수 빼기
const answer =
[...closet.values()].reduce((acc, cur) => acc * (cur.length + 1), 1) - 1;
return answer;
}
59 changes: 58 additions & 1 deletion Programmers/Level2/72411_메뉴_리뉴얼.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,60 @@
/*
⭐️ 문제 정보 ⭐️
문제 : 72411 - 메뉴 리뉴얼
레벨 : Level 2
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/72411
*/

// ANCHOR 2025.10.07 풀이
function combination(arr, n) {
// arr 배열에서 n개 뽑는 조합들을 담은 배열 반환
if (n === 1) return arr.map((el) => [el]);

const result = [];
arr.forEach((fixed, idx) => {
// fixed 이후의 원소들을 뽑는 조합을 찾아내야 함.
const rest = arr.slice(idx + 1);
const comb = combination(rest, n - 1);
const combine = comb.map((c) => [fixed, ...c]);
result.push(...combine);
});

return result;
}

function solution(orders, course) {
let answer = [];

// 조합 만들기
for (const cnt of course) {
// cnt개 코스 결정하기
const courseMap = new Map(); // key: 코스 조합 value: 주문 횟수
for (const order of orders) {
const sortedOrder = order.split("").sort();
combination(sortedOrder, cnt).forEach((comb) => {
// 코스가 존재하는 경우 주문 횟수를 증가시켜줌
const courseName = comb.join("");
courseMap.set(courseName, (courseMap.get(courseName) || 0) + 1);
});
}
// 많이 주문된 것 answer에 담기
if (courseMap.size > 0) {
const maxCount = Math.max(...courseMap.values());
// 최소 2번 이상 주문되었고, 최댓값인 메뉴만 추가
if (maxCount >= 2) {
courseMap.forEach((count, courseName) => {
if (count === maxCount) {
answer.push(courseName);
}
});
}
}
}

return answer.sort();
}

// ANCHOR 2024.03.02 풀이
// map: 조합 저장 맵
// arr: 조합을 만드려는 배열
// comb: 조합을 만들고 있는 배열
Expand All @@ -22,7 +79,7 @@ function combination(map, arr, comb, idx, goal) {
}
}

function solution(orders, course) {
function solution1(orders, course) {
const menuMap = new Map(course.map((count) => [count, new Map()])); // key: 코스 길이, (key: 메뉴 조합, value: 주문 횟수)
// 각 손님별로 반복
orders.forEach((order, idx) => {
Expand Down
Loading