본문 바로가기
Algorithm/programmers

[JS]programmers: 메뉴리뉴얼

by 갈잃자 2022. 10. 13.

https://school.programmers.co.kr/learn/courses/30/lessons/72411?language=javascript 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


까다로웠던 문제..

 

일단 모든 조합들을 찾는대에 있어서 까다로움이 있었다.

이는 조합을 구하는 코드를 다른 블로그에서 인용함

// 조합을 구하는 공식 참고
const getCombination = (arr, selectNumber) => {
    const results = [];
    if (selectNumber===1) return arr.map((el) => [el])
    arr.forEach((fixed, index, origin) => {
        const rest = origin.slice(index +1);
        const combinations = getCombination(rest, selectNumber - 1);
        const attached = combinations.map((el) => [fixed, ...el]); 
        results.push(...attached); 
    })
    return results
}

조합 공식을 보면.. 재귀로 조합을 구하였음을 알 수 있다.

 

이제 전체 식

// 조합을 구하는 공식 참고
const getCombination = (arr, selectNumber) => {
    const results = [];
    if (selectNumber===1) return arr.map((el) => [el])
    arr.forEach((fixed, index, origin) => {
        const rest = origin.slice(index +1);
        const combinations = getCombination(rest, selectNumber - 1);
        const attached = combinations.map((el) => [fixed, ...el]); 
        results.push(...attached); 
    })
    return results
}

function solution(orders, course) {
    var answer = [];
    course.forEach(c => {
        var obj = {}
        orders.forEach(order => {
            // 문자열을 배열로 하나씩 만들어줌 ex) 'abc' -> ['a','b','c']
            var arr = [...order].sort()

            const getCombinations = getCombination(arr, c)
            getCombinations.forEach(element => {
                // 조합으로 나온 array를 다시 문자열로 붙여줌
                var b =element.join('')
                // obj라는 빈 object에 하나씩 더해줌
                if (b in obj ===false) {
                    obj[b] = 1
                }
                else {
                    obj[b] +=1
                }                
            });
        });
        // Max값을 구하는 식인데, value들만 가지고 array를 만듬
        let Maxarr = Object.values(obj)
        let Max = Math.max(...Maxarr)

        // 2명 이상의 손님에게 주문을 받아야 가능
        if (Maxarr.length!==1 && Max!==1) {

            // 2명 이상 주문받은 코스메뉴 후보중 가장 많은 선택을 받은 코스요리 선정
            for(var ob in obj) {
                if (Max === obj[ob]) {
                    answer.push(ob)
                }
            }
        }
    });

    // 출력값을 위해 sort 해줌
    answer.sort()
    return answer;
}

문제를 처음엔 잘 이해하지 못해서 헛짓을 좀 했다ㅠㅠ

 

새롭게 알게 된 사실

- object도 for문이 가능하다!

for(var ob in obj) {
    if (Max === obj[ob]) {
        answer.push(ob)
        }
}

// for in문을 써서 object를 ob(key)값으로 하나씩 불러 낼 수 있음!

- object의 value들만 모아 array로 만드는 코드

let arr = Object.values(obj)

- array의 Max값을 구하는 코드

let Max = Math.max(...Maxarr)

- 배열을 string으로 변환하는 코드

var b =element.join('')

댓글