[코딩테스트][프로그래머스]🔥 "이모티콘 할인행사" 문제: Python과 Java로 완벽 해결하기! 🔥

김상욱·2024년 7월 14일
0
post-thumbnail

🔗 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/150368

🕒 Python 풀이시간: 20분

from itertools import product

def solution(users, emoticons):
    answer = []
    
    sales_percent=[10,20,30,40]
    
    cases=list(product(sales_percent,repeat=len(emoticons)))
    for case in cases:
        plus_service=0
        sales_total=0
        for user in users:
            total=0
            add_service=False
            for i in range(len(emoticons)):
                if case[i]>=user[0]:
                    total+=emoticons[i]*(100-case[i])//100
                if total>=user[1]:
                    plus_service+=1
                    add_service=True
                    break
            if not add_service:
                sales_total+=total
        answer.append([plus_service,sales_total])
    
    answer.sort(key=lambda x:(x[0],x[1]))
    # print(answer)
    return answer[-1]

🕒 Java 풀이시간: 30분

import java.util.*;

class Solution {
    public static List<int[]> generateProducts(int[] arr,int r){
        List<int[]> products=new ArrayList<>();
        int[] product=new int[r];
        generateProduct(arr,r,product,0,products);
        
        return products;
    }
    
    public static void generateProduct(int[] arr,int r,int[] product, int index,List<int[]> products){
        if(r==index){
            products.add(product.clone());
            return;
        }
        for(int i=0;i<arr.length;i++){
            product[index]=arr[i];
            generateProduct(arr,r,product,index+1,products);
        }
    }
    
    public int[] solution(int[][] users, int[] emoticons) {
        int[] answer = {};
        int[] percentList={10,20,30,40};
        List<int[]> allCases=generateProducts(percentList,emoticons.length);
        int caseMaxServiceOwnerNum=0;
        int caseMaxTotal=0;
        for(int[] oneCase:allCases){
            int caseServiceOwner=0;
            int caseTotal=0;
            for(int[] user:users){
                int oneUserTotal=0;
                boolean userServiceOwned=false;
                for(int i=0;i<emoticons.length;i++){
                    if(oneCase[i]>=user[0]){
                        oneUserTotal+=(emoticons[i])*(100-oneCase[i])/100;
                    }
                    if(oneUserTotal>=user[1]){
                        caseServiceOwner+=1;
                        userServiceOwned=true;
                        break;
                    }
                }
                if(!userServiceOwned){
                    caseTotal+=oneUserTotal;
                }
            }
            if(caseServiceOwner>caseMaxServiceOwnerNum){
                caseMaxServiceOwnerNum=caseServiceOwner;
                caseMaxTotal=caseTotal;
            }else if(caseServiceOwner==caseMaxServiceOwnerNum&&caseTotal>caseMaxTotal){
                caseMaxTotal=caseTotal;
            }
        }
        
        answer=new int[]{caseMaxServiceOwnerNum,caseMaxTotal};
        return answer;
    }
}

🧩 모든 경우의 수 쉽게 이해하기!

이 문제는 각 이모티콘에 대해 모든 할인율을 적용해보는 것을 요구합니다. 이모티콘의 개수가 최대 7개이고, 할인율이 4개이기 때문에 가능한 경우의 수는 474^7로 충분히 시간 내에 해결할 수 있습니다

🔄 중복 순열 활용하여 모든 할인 조합 구하기!

중복 순열을 사용하여 가능한 모든 할인율 조합을 구했습니다. 이를 통해 각 조합에 대해 모든 사용자의 구매 여부를 탐색할 수 있었습니다.

✅ 최적의 서비스 가입자와 매출 확인 방법!

각 조합이 적용된 경우에 대해, 사용자의 구매 금액과 서비스 가입 여부를 확인했습니다. 이를 통해 모든 경우를 확인할 수 있었습니다.

🔍 효율적인 탐색: 사용자와 이모티콘 가격 비교!

각 조합에 대해 이중 for문을 사용하여 모든 사용자를 탐색하면서, 각 이모티콘의 할인된 가격을 계산하고, 사용자의 구매 금액과 비교하여 서비스 가입 여부를 확인했습니다. 이 과정에서 해당 사용자의 서비스 가입을 원하는 가격보다 현재 구매 가격이 높아지면 서비스를 구매하는 방식으로 서비스 가입 여부를 확인할 수 있었습니다. 그 후, 최종적으로 if문으로 가장 서비스 가입 자가 많고 판매 금액이 많은 경우를 구할 수 있었습니다.

이렇게 Python과 Java로 프로그래머스의 할인 행사 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊

0개의 댓글