[C#] 이모티콘 할인행사

소슬잎·2023년 11월 10일

프로그래머스 문제

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

풀이 후기

1. 분석

최대를 찾는 이분탐색인가 싶었지만... 사용자 마다 다르게 적용되는 비율과 가격, 그리고 통일도 안시켜주는 이모티콘 가격을 보면 식을 통해 공식 찾기는 포기했다. 제한사항도 보면 그렇게 숫자가 크지 않아서 그냥 풀면 될 것 같았다. 사실 그것보다는 내가 가진 지식으로 풀 방법이 없어서 그냥 풀었다는 말이 좀 더 맞는 말이긴 한데, 찾아봐도 다 비슷비슷 하게 푼듯.

2. 실행 결과

3. 코드

using System;
using System.Collections.Generic;

public class Solution {
    public User[] userArray;
    public List<int[]> discounts = new List<int[]>();
    
    public class User{
        public int index;
        public int minper;
        public int minprice;
        
        public User(int i, int per, int pri){
            index = i;
            minper = per;
            minprice = pri;
        }
        
        public (int, int) Calc(int[] emos, int[] discount){
            int price = 0;
            
            for(int i = 0; i < emos.Length; i++){
                if(minper <= discount[i]){
                    price += emos[i] * (100 - discount[i]) / 100;
                }
                
                if(minprice <= price){
                    return (1, 0);
                }
            }
            
            return (0, price);
        }
    }

    public void MakeDiscounts(int[] discount, int index)
    {
        if (index == discount.Length)
        {
            discounts.Add((int[])discount.Clone());
        }
        else
        {
            for (int i = 1; i <= 4; i++)
            {
                discount[index] = i * 10;
                MakeDiscounts(discount, index + 1);
            }
        }
    }

    public int[] solution(int[,] users, int[] emoticons)
    {
        var userLen = users.GetLength(0);
        userArray = new User[userLen];
        for(int i = 0; i < userLen; i++){
            userArray[i] = new User(i, users[i, 0], users[i, 1]);
        }
        
        var emoLen = emoticons.Length;
        var arr = new int[emoLen];
        MakeDiscounts(arr, 0);
        
        var answerPlus = 0;
        var answerPrice = 0;
        foreach (var discount in discounts)
        {
            var plus = 0;
            var price = 0;

            foreach (var user in userArray)
            {
                var result = user.Calc(emoticons, discount);
                plus += result.Item1;
                price += result.Item2;
            }

            if (answerPlus == plus)
            {
                answerPrice = Math.Max(answerPrice, price);
            }
            else if (answerPlus < plus)
            {
                answerPlus = plus;
                answerPrice = price;
            }
        }

        return new[] { answerPlus, answerPrice };
    }
}

그냥 계산용 사람 클래스 만들어두고, 모든 할인율을 다 만들고 다 대입해봐서 값 뽑아내고 끝.

profile
그냥 바보

0개의 댓글