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

 

프로그래머스

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

programmers.co.kr

입력

2차원 배열 users는 각 유저의 할인 기준과 구매 기준 금액
각 요소는 [할인 기준 %, 구매 기준 금액] 형식
정수 배열 emoticons는 이모티콘 정가 리스트이며, 각 이모티콘마다 10%, 20%, 30%, 40% 중 하나의 할인율을 선택 가능

 

핵심 아이디어

각 이모티콘에 대해 10%, 20%, 30%, 40% 할인율을 적용한 모든 조합을 완전탐색
각 조합마다 모든 유저가 어떻게 반응하는지를 시뮬레이션
사용자는 자신이 설정한 할인 기준 이상인 이모티콘만 구매 대상으로
총 구매 금액이 기준 금액 이상이면 이모티콘 플러스에 가입하고, 구매 X
그 외의 경우에는 구매한 이모티콘들의 금액을 모두 합산
가입자 수를 우선으로 비교하고, 같을 경우 총 판매 금액이 높은 조합을 선택

 

변수 설명

plus: 현재까지 나온 최대 플러스 가입자 수
buy: plus 기준에서의 최대 이모티콘 판매 금액
arr: 현재 할인율 조합을 저장하는 배열 (이모티콘 개수와 동일한 길이)
recursive: 가능한 모든 할인율 조합을 탐색하는 재귀 함수
calc: 현재 할인 조합에서 유저 반응을 계산하는 함수
userPer: 해당 유저가 구매를 고려하는 최소 할인율
userLimit: 해당 유저의 플러스 가입 기준 금액
sum: 유저가 실제 구매한 총 금액
cnt: 현재 조합에서 플러스 가입한 유저 수
buySum: 실제 구매가 발생한 총 금액

 

예시

- 입력
users = { {40, 10000}, {25, 10000} }
emoticons = {7000, 9000}

가능한 할인 조합은 4^2 = 16가지이다
예를 들어 할인율 조합이 [40, 40]이면
7000 * 0.6 = 4200
9000 * 0.6 = 5400
유저 1은 40% 이상만 보기 때문에 두 이모티콘 모두 구매
총합 9600 → 10000 미만 → 구매함
유저 2는 25% 이상 조건 만족, 동일하게 총합 9600 → 구매함
따라서 플러스 가입자 0명, 구매 총액 19200원
이와 같은 방식으로 모든 조합을 비교해 가장 많은 가입자 수와 가장 높은 판매금액 조합을 선택

- 출력

[최대 플러스 가입자 수, 해당 조건에서의 최대 판매 금액] 형태의 정수 배열을 반환

 

 

정답코드

import java.util.*;

class Solution {
    private int plus = 0;
    private int buy = 0;

    public int[] solution(int[][] users, int[] emoticons) {


        int[] arr = new int[emoticons.length];

        recursive(arr, 0, users, emoticons);




        return new int[]{plus, buy};
    }


    public void recursive(int[] arr, int startIdx, int[][] users, int[] emoticons){

        if(startIdx == arr.length){

            calc(arr, users, emoticons);
            return;
        }
        
        for(int i=10; i<=40; i+=10){

            arr[startIdx] = i;
            recursive(arr, startIdx+1 ,users, emoticons);
        }
    }

    private void calc(int[] arr, int[][] users, int[] emoticons){

        int cnt = 0;
        int buySum = 0;

        for(int i=0; i<users.length; i++){

            int userPer = users[i][0];
            int userLimit = users[i][1];
            int sum = 0;

            for(int j=0; j<arr.length; j++){

                if(arr[j] >= userPer){

                    sum += emoticons[j] * (100 - arr[j]) / 100;
                }
            }

            if(sum >= userLimit){

                // 유저 구매 상한보다 높으면 이모티콘 플러스 가입
                cnt++;
            } else{
                // 낮으면 그냥 구매
                buySum+=sum;
            }
        }
            if(cnt > plus){
                plus = cnt;
                buy = buySum;
            }
            if(cnt == plus){

                if(buy < buySum){
                    buy = buySum;
                }
            }
    }
}

+ Recent posts