JAVA/Coding Test

[JAVA] 프로그래머스 이모티콘 할인행사_구현

오늘도개발 2024. 9. 25. 17:15

 

문제 : 

https://school.programmers.co.kr/learn/courses/30/lessons/150368?language=java

 

프로그래머스

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

programmers.co.kr

 

 

문제 설명 : 

 

  - 사용자가 정한 할인율 이상 할인하는 이모티콘을 모두 구매한다.

 

  - 만약, 사용자가 가진돈이상의 이모티콘 구매 금액이 발생할 경우 플러스에 가입을 한다.

 

  - 이모티콘 각각의 할인율을 적절하게 지정하여 최대의 플러스 가입자 수와 이모티콘 판매 금액을 만든다.

 

 

접근 : 

 

 - 이모티콘의 할인율을 10%, 20%, 30%, 40% 으로 중복을 허용하여 이모티콘의 갯수만큼 조합을 구한다.

 

 - 이모티콘의 할인율이 모두 결정되면 해당 할인율을 이용하여 플러스 가입자 수와 이모티콘 판매 금액을 계산한다.

 

 - 만약, 이전의 결과 보다 플러스 가입자 수가 많다면 현재 결과로 값을 갱신한다.

 

 - 만약, 플러스 가입자 수가 동일하다면, 판매 금액이 큰 결과로 값을 갱신한다.

 

 

코드 구현 :

class Solution {
    int[] discounts;
    int[] res;
    private void checkCondition(int[][] users, int[] emoticons){
        int[] temp_res = new int[]{0, 0};

        for (int[] user : users) {
            double totalBuy = 0;

            for (int i = 0; i < emoticons.length; i++) {
                if (user[0] <= discounts[i])
                    totalBuy += emoticons[i] * (100 - discounts[i]) / 100.0;
            }

            if (totalBuy >= user[1]) temp_res[0]++;
            else temp_res[1] += (int) totalBuy;
        }
        // 플러스 가입자 수가 더 많거나, 동일한 경우 더 많은 이익이면 갱신
        if (temp_res[0] > res[0] || (temp_res[0] == res[0] && temp_res[1] > res[1])) res = temp_res;
    }
    private void countAvailable(int[][] users, int[] emoticons, int depth) {
        if (depth == emoticons.length) {
            checkCondition(users, emoticons);
            return;
        }

        // 40%, 30%, 20%, 10% 할인율을 순차적으로 적용
        for (int i = 40; i >= 10; i -= 10) {
            discounts[depth] = i;
            countAvailable(users, emoticons, depth + 1);
        }
    }

    public int[] solution(int[][] users, int[] emoticons) {
        discounts = new int[emoticons.length];
        res = new int[]{0, 0};

        countAvailable(users, emoticons, 0);
        return res;
    }
}