본문 바로가기
  • 살짝 구운 김 유나
Algorithm/Programmers

[Lv.2] 이모티콘 할인행사 - JavaScript

by yunae 2023. 5. 8.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/150368

 

프로그래머스

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

programmers.co.kr

 

풀이

1. 모든 경우의 할인율 조합을 구한다.

2. 할인율 조합, users, emoticons 세가지로 3중 for문을 돌면서 각 경우에 대한 [가입자수, 판매액] 값을 구한다.

2. 가입자수가 많은, 판매액이 높은 순으로 다중 조건 정렬을 수행한다.

 

코드

function solution(users, emoticons) {
  const len = emoticons.length;

  // 모든 경우의 수를 구하는 함수
  const combination = () => {
    const cases = [];
    // 재귀함수로 구현
    const getCombination = (curCase) => {
      if (curCase.length === len) {
        cases.push(curCase);
        return;
      }

      for (let rate of [0.1, 0.2, 0.3, 0.4]) {
        getCombination([...curCase, rate]);
      }
    };
    // 함수 호출하기
    getCombination([]);
    return cases;
  };

  // 모든 경우의 판매율 조합
  const cases = combination();
  // 모든 경우의 [가입자수, 판매액]을 담을 배열
  let res = [];
  cases.forEach((arr) => {
    let join = 0;
    let sum = 0;
    for (let i = 0; i < users.length; i++) {
      // 판매액
      let purchase = 0;
      for (let j = 0; j < len; j++) {
        // 00 퍼센트 이상 할인하면
        if (users[i][0] * 0.01 <= arr[j]) {
          // 구매하기
          purchase += (1 - arr[j]) * emoticons[j];
          // 기준 금액을 초과하면
          if (purchase >= users[i][1]) {
            // 가입하기
            join++;
            break;
          }
        }
      }
      // 가격을 넘지 않은 경우에만 판매액으로 합산
      if (purchase < users[i][1]) sum += purchase;
      // 가입자 수와 판매액 result에 저장
      res.push([join, sum]);
    }
  });

  // 가입자 수 내림차순, 판매액 내림차순으로 정렬
  res.sort((a, b) => b[0] - a[0] || b[1] - a[1]);

  // 맨 처음 원소가 답
  return res[0];
}

 

 

 

댓글