pkuImoogis / study-codingTest

0 stars 0 forks source link

이모티콘 할인행사 #351

Open geonnho0 opened 8 months ago

geonnho0 commented 8 months ago

문제 링크

geonnho0 commented 8 months ago

최대 7개의 이모티콘은 각자 4개의 값을 가질 수 있어요. 따라서 완전 탐색으로 모든 조건을 조회해서 우선되는 값을 반환하면 돼요.

코드

class Solution {

    int[][] users;
    int[] emoticons;
    int[] discount;
    int uCount, eCount;
    int[] answer = {0, 0};

    public int[] solution(int[][] users, int[] emoticons) {
        init(users, emoticons);
        dfs(0);
        return answer;
    }

    void init(int[][] users, int[] emoticons) {
        this.users = users;
        this.emoticons = emoticons;
        uCount = users.length;
        eCount = emoticons.length;
        discount = new int[eCount];
    }

    void dfs(int index) {
        if (index == eCount) {
            int plusCount = 0, totalBuy = 0;
            for (int i = 0; i < uCount; i++) {
                int b = buy(i);
                if (plus(i, b))
                    plusCount++;
                else
                    totalBuy += b;
            }
            if (answer[0] < plusCount) {
                answer[0] = plusCount;
                answer[1] = totalBuy;
            }
            else if (answer[0] == plusCount) {
                answer[1] = Math.max(answer[1], totalBuy);
            }
            return;
        }

        for (int i = 10; i <= 40; i += 10) {
            discount[index] = i;
            dfs(index + 1);
        }
    }

    boolean plus(int user, int sum) {
        return sum >= users[user][1];
    }

    int buy(int user) {
        int sum = 0;
        for (int i = 0; i < eCount; i++)
            if (discount[i] >= users[user][0])
                sum += (emoticons[i] * (100 - discount[i])) / 100;
        return sum;
    }
}