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

이모티콘 할인행사

https://school.programmers.co.kr/learn/courses/30/lessons/150368 (opens in a new tab)

풀이

이모티콘의 개수를 100만개로 착각해서 완전탐색 이외의 풀이 방법을 생각하다보니 아예 못풀었다... 이 풀이도 보자마자 comb 함수의 동작을 직관적으로 파악하지 못했는데 이런 부분에 좀 더 익숙해져야할 것 같다. 혹시 미래의 내가 해석을 못할 때를 대비하자면 예를 들어서 3개의 이모티콘에 대해서 할인 비율을 구하자면 [10, 10, 20], [10, 10, 30], [10, 10, 40], [10, 20, 10], [10, 20, 20] ... 같은 식으로 할인율이 바뀌면서 동작한다.

import java.util.*;
class Solution {
    int sign = 0;
    int earn = 0;
 
    public int[] solution(int[][] users, int[] emoticons) {
        int[] answer = new int[2];
 
        int[] arr = new int[emoticons.length];
 
        comb(arr, 0, users, emoticons);
 
        answer[0] = sign;
        answer[1] = earn;
 
        return answer;
    }
 
    public void comb(int[] arr, int start, int[][] users, int[] emoticons) {
 
        if (start == arr.length) {
            calculate(arr, users, emoticons);
            return;
        }
 
        for (int i = 10; i <= 40; i += 10) {
            arr[start] = i;
            comb(arr, start + 1, users, emoticons);
        }
 
    }
 
    public void calculate(int[] arr, int[][] users, int[] emoticons) {
 
        int count = 0;
        int earn_t = 0;
 
        for (int[] user : users) {
            int discount = user[0];
            int price = user[1];
            int sum = 0;
 
            for (int i = 0; i < arr.length; i++) {
                if (arr[i] >= discount) {
                    sum += (emoticons[i] / 100) * (100 - arr[i]);
                }
            }
 
            if (sum >= price) {
                count++;
            } else {
                earn_t += sum;
            }
        }
 
 
        if (count > sign) {
            sign = count;
            earn = earn_t;
            return;
        } else if (count == sign) {
            if (earn < earn_t) {
                earn = earn_t;
            }
        }
    }
}