https://school.programmers.co.kr/learn/courses/30/lessons/131701
최대를 찾는 이분탐색인가 싶었지만... 사용자 마다 다르게 적용되는 비율과 가격, 그리고 통일도 안시켜주는 이모티콘 가격을 보면 식을 통해 공식 찾기는 포기했다. 제한사항도 보면 그렇게 숫자가 크지 않아서 그냥 풀면 될 것 같았다. 사실 그것보다는 내가 가진 지식으로 풀 방법이 없어서 그냥 풀었다는 말이 좀 더 맞는 말이긴 한데, 찾아봐도 다 비슷비슷 하게 푼듯.
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 };
}
}
그냥 계산용 사람 클래스 만들어두고, 모든 할인율을 다 만들고 다 대입해봐서 값 뽑아내고 끝.