반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

짧은코딩

프로그래머스) 이모티콘 할인행사 본문

코딩테스트 with JS/백준, 프로그래머스

프로그래머스) 이모티콘 할인행사

5_hyun 2023. 2. 7. 23:55

-문제 사이트

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

 

프로그래머스

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

programmers.co.kr

코드

function solution(users, emoticons) {
  let count = 0,
    money = 0;
  let allCase = [];
  let disCount = [10, 20, 30, 40];

  // 모든 경우의 수를 구해주는 DFS
  function DFS(emotions, case1) {
    if (emotions.length < 1) {
      allCase.push(case1);
      return;
    }

    for (let i = 0; i < 4; i++) {
      DFS(emotions.slice(1), [...case1, [disCount[i], emotions[0]]]);
    }
  }

  DFS(emoticons, []);

  // 할인된 가격 구해주는 함수
  const disCountPrice = (per, price) => ((100 - per) / 100) * price;

  // way는 한 가지 경우의 수
  allCase.forEach((way) => {
    let tempC = 0,
      tempM = 0;

    users.forEach((user) => {
      let price = 0;

      way.forEach((info) => {
        if (user[0] <= info[0]) price += disCountPrice(info[0], info[1]);
      });

      if (price >= user[1]) tempC++;
      else tempM += price;
    });

    if (count < tempC) {
      count = tempC;
      money = tempM;
    } else if (count === tempC) {
      money = Math.max(money, tempM);
    }
  });

  return [count, money];
}

풀이 방법

이 문제는 처음에 for문을 최대한 사용하지 않을 생각에 막막했지만 의외로 그냥 단순하게 풀면되는 문제이다. 

 

  function DFS(emotions, case1) {
    if (emotions.length < 1) {
      allCase.push(case1);
      return;
    }

    for (let i = 0; i < 4; i++) {
      DFS(emotions.slice(1), [...case1, [disCount[i], emotions[0]]]);
    }
  }

  DFS(emoticons, []);

allCase

DFS 함수를 이용해서 이모티콘 할인율에 대한 모든 경우의 수를 구하고 allCase에 저장한다. allCase에는 위 사진처럼 저장된다.

  // 할인된 가격 구해주는 함수
  const disCountPrice = (per, price) => ((100 - per) / 100) * price;

  // way는 한 가지 경우의 수
  allCase.forEach((way) => {
    let tempC = 0,
      tempM = 0;

    users.forEach((user) => {
      let price = 0;

      way.forEach((info) => {
        if (user[0] <= info[0]) price += disCountPrice(info[0], info[1]);
      });

      if (price >= user[1]) tempC++;
      else tempM += price;
    });

    if (count < tempC) {
      count = tempC;
      money = tempM;
    } else if (count === tempC) {
      money = Math.max(money, tempM);
    }
  });

allCase에 저장된 모든 경우의 수를 순회한다. 그리고 각 user에 대한 모든 할인값을 구하고 플러스 서비스 가입여부를 판단한다. 이를 tempC, tempM에 저장하고 최종 반환하는 count와 money와 비교 후 값을 최신화시킨다.

728x90
반응형
Comments