프로그래머스/자바 Lv2

[프로그래머스] Java Lv2. 코딩테스트 연습 > 2023 KAKAO BLIND RECRUITMENT > 이모티콘 할인행사

행수쌤 2024. 12. 14. 11:08
728x90
반응형

 

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제설명

사용자 정보 배열에 [이모티콘을 구매할 할인율(비율), 이모티콘 플러스 구매결정 금액(가격)]이 담겨있다.

이모티콘 배열에 현재 이모티콘들의 가격이 담겨있다.

이모티콘별로 할인율이 결정(10%, 20%, 30%, 40%)되는데, 각각의 사용자는 개인의 이모티콘을 구매할 할인율 이상이 적용된 이모티콘을 구입하게 된다.

(구매하기로 결심한 이모티콘들의 할인율이 적용된 가격의 총합) >= (본인의 이모티콘 플러스 구매결정 금액) 이라면 이모티콘 서비스를 가입하게 된다.

이모티콘 서비스 가입자 수를 최대일 때의 판매액 최고 금액을 return한다.

제한사항

  • 1 <= users의 길이 <= 100
  • 1 <= 비율 <= 40
  • 100 <= 가격 <= 1,000,000  가격은 100의 배수
  • 1 <= emotions의 길이 <= 7
  • 100 <= emotions의 원소 <= 1,000,000

접근방법

이모티콘 할인율이 4가지 경우의수로 한정되어 있고, 이모티콘의 최대 개수는 7개이다. 즉 이모티콘별 할인율을 전체탐색을 해도 4^7가 나오는데 이는 충분히 전체탐색 할만한 수치이다.

이모티콘 개수에 따라 전체 탐색할 케이스를 만들어 전체탐색 후 return 조건에 만족하는 결과를 반환한다.

핵심로직

이모티콘 할인율 전체 경우의수 계산 : 4^(이모티콘개수)

각 경우의 수마다 개인별 구매 결정여부를 판단하고, 이모티콘 플러스 서비스 가입여부 판단하여 카운트

최댓값 구하여 반환

입출력 예

  • users = [[40, 10000], [25, 10000]]
  • emotions = [7000, 9000]
  • result = [1, 5400]

코드작성

class Solution {
    public int[] solution(int[][] users, int[] emoticons) {
        // 이모티콘별 할인율 배열
        int[] saleRate = new int[emoticons.length];
        // 이모티콘 할인율 경우의수
        int saleRateCase = (int) Math.pow(4, emoticons.length);
        int join = 0;  // 가입자수
        int sum = 0;  // 매출액
        for(int i=0; i<saleRateCase; i++) {
            // 이모티콘별 할인율 계산
            for(int j=0; j<saleRate.length; j++) {
                saleRate[j] = 10 * (1 + (i / (int) Math.pow(4, j)) % 4);
            }
            int userJoin = 0;
            int userSums = 0;
            
            for(int j=0; j<users.length; j++) {
                int userSum = 0;  // 유져금액 합계
                int userRate = users[j][0];
                for(int l=0; l<saleRate.length; l++) {
                    if(saleRate[l] >= userRate) {
                        userSum += (emoticons[l] * (100-saleRate[l])) / 100;
                    }
                }
                if(userSum >= users[j][1]) {
                    userJoin ++;
                } else {
                    userSums += userSum;
                }
            }
            if(userJoin == join) {
                join = userJoin;
                sum = Math.max(sum, userSums);
            } else if(userJoin > join) {
                join = userJoin;
                sum = userSums;
            }
        }
        int[] answer = {join, sum};
        return answer;
    }
}
728x90
반응형