๐ ๋ฌธ์ ๋งํฌ
ํ๋ก๊ทธ๋๋จธ์ค ์ด๋ชจํฐ์ฝ ํ ์ธํ์ฌ ๋ฌธ์ ๋ฅผ ์๋ฐ๋ก ํ์ดํ์ต๋๋ค.
https://school.programmers.co.kr/learn/courses/30/lessons/150368
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
๐ ๋ฌธ์ ํ์ด
๋ฌธ์ ์์ ์ ์๋ ๋ชฉํ์ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ๋ค.
[๋ชฉํ]
- ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ์๋น์ค ๊ฐ์ ์๋ฅผ ์ต๋ํ ๋๋ฆฌ๋ ๊ฒ
- ์ด๋ชจํฐ์ฝ ํ๋งค์ก์ ์ต๋ํ ๋๋ฆฌ๋ ๊ฒ. (1๋ฒ ๋ชฉํ๊ฐ ์ฐ์ , ๊ทธ ๋ค์ 2๋ฒ ๋ชฉํ)
[์กฐ๊ฑด]
- ์ด๋ชจํฐ์ฝ ํ ์ธ์จ์ 10%, 20%, 30%, 40% ๋ก ์ด 4๊ฐ์ง
- ์ฌ์ฉ์๋ ์์ ์ ๊ธฐ์ค ๋น์จ ์ด์์ผ๋ก ํ ์ธํ๋ ์ด๋ชจํฐ์ฝ ๊ตฌ๋งคํ๊ณ , ๊ธฐ์ค ๊ฐ๊ฒฉ ์ด์์ธ ๊ฒฝ์ฐ ํ๋ฌ์ค ์๋น์ค ๊ฐ์
๋ด๊ฐ ๋ ์ฌ๋ฆฐ ๋ฐฉ๋ฒ์ ๋ฌธ์ ์์ ์ ์๋ ์กฐ๊ฑด๊ณผ ๋ชฉํ๋ฅผ ๊ทธ๋๋ก ์ฝ๋๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด์๋ค.
1. ์ด๋ชจํฐ์ฝ์ ํ ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ ์กฐํฉ ๊ตฌํ๊ธฐ
2. ๊ฐ ์กฐํฉ์ ๊ฐ์ง๊ณ , ๋ชจ๋ ์ฌ์ฉ์์ ๊ตฌ๋งค ์ฌ๋ถ๋ฅผ ์ฒดํฌํ์ฌ ์ต๋๊ฐ ๊ฐฑ์
๋จผ์ , ์กฐํฉ์ ๊ตฌํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ด๋ชจํฐ์ฝ์ ํ ์ธ์จ ์กฐํฉ์ 10, 10, 10 ์ฒ๋ผ ์ค๋ณตํ ์ ์์ผ๋ฏ๋ก ์ค๋ณต์กฐํฉ์ ์ฝ๋๋ก ๊ตฌํํ๋ค.
// toChoose: ๋ฝ์์ผ ํ๋ ์, choosed: ๋ฝ์ ์๋ค์ ๋ฐฐ์ด
static void makeComb(int toChoose, int[] choosed){
if(toChoose == 0){
calculate(choosed);
return;
}
// ํ ์ธ์ ์กฐํฉ์ ์ค๋ณต์กฐํฉ์ด๊ธฐ๋๋ฌธ์ ์์ ์ธ๋ฑ์ค๋ ์์ด๋ ๋๋ค.
// sale: ํ ์ธ์จ์ด ๋ด๊ธด ๋ฐฐ์ด ({10, 20, 30, 40})
for(int i = 0; i < sale.length; i++){
choosed[choosed.length-toChoose] = sale[i];
makeComb(toChoose-1, choosed);
}
}
์ดํ calculate ๋ผ๋ ํจ์๋ก ๋ชจ๋ ์ฌ์ฉ์์ ๊ตฌ๋งค๋ฅผ ์ฒดํฌํ์ฌ ์ต๋๊ฐ์ ๊ฐฑ์ ํ๋ค.
// choosed: makeComb์์ ๋ฝ์ ์ด๋ชจํฐ์ฝ ๋ณ ํ ์ธ์จ์ด ๋ด๊ธด ๋ฐฐ์ด
static void calculate(int[] choosed){
int join = 0; // ํ๋ฌ์ค ํ์ ์
int sum = 0; // ๊ตฌ๋งค ์ด ํฉ
int cnt = choosed.length; // ์ด๋ชจํฐ์ฝ ๊ฐ์
int[] price = new int[cnt]; // ํ ์ธ๋ ์ด๋ชจํฐ์ฝ ๊ฐ๊ฒฉ ๋ฐฐ์ด
// ํ ์ธ๋ ์ด๋ชจํฐ์ฝ ๊ฐ๊ฒฉ ๊ตฌํ๊ธฐ
for(int i = 0; i < cnt; i++){
price[i] = emoticons[i] * (100 - choosed[i]) / 100;
}
// ๋ชจ๋ ์ฌ์ฉ์์ ๊ตฌ๋งค ๊ณ์ฐํ๊ธฐ
for(int i = 0; i < users.length; i++){
int temp = 0; // ๊ตฌ๋งค ๊ฐ๊ฒฉ์ ์ด ํฉ์ ๋ด์ ๋ณ์
int ratio = users[i][0]; // ๋น์จ ์ด์์ ํ ์ธ ์ด๋ชจํฐ์ฝ์ ๊ตฌ๋งค
int min = users[i][1]; // ๊ฐ๊ฒฉ ์ด์์ ์ฌ์ฉ ์, ํ๋ฌ์ค ํ์์ผ๋ก
for(int j = 0; j < cnt; j++){
// ๋น์จ ์ด์์ ํ ์ธ ์ด๋ชจํฐ์ฝ์ธ ๊ฒฝ์ฐ ๊ตฌ๋งค
if(choosed[j] >= ratio){
temp += price[j];
}
}
// ๊ตฌ๋งค ์ด๋ชจํฐ์ฝ์ด ๊ฐ๊ฒฉ ์ด์์ธ ๊ฒฝ์ฐ ํ๋ฌ์ค ํ์ ๊ฐ์
if(temp >= min){
join++;
}
// ์ดํฉ์ ๊ตฌ๋งค ๊ธ์ก ๋ํ๊ธฐ
else{
sum += temp;
}
}
// ๊ธฐ์กด ํ์ ์๋ณด๋ค ํฐ ๊ฒฝ์ฐ ๊ฐฑ์
if(answer[0] < join){
answer[0] = join;
answer[1] = sum;
}
// ํ์์๋ ๊ฐ์ผ๋ ์ดํฉ์ด ๋ ํฐ ๊ฒฝ์ฐ ๊ฐฑ์
else if(answer[0] == join){
answer[0] = join;
answer[1] = Math.max(answer[1], sum);
}
return ;
}
๐ ์ ์ฒด ์ฝ๋
import java.io.*;
import java.util.*;
class Solution {
static int[][] users;
static int[] emoticons;
static int[] sale;
static int[] answer = new int[2];
public int[] solution(int[][] users, int[] emoticons) {
this.users = users;
this.emoticons = emoticons;
this.sale = new int[]{10, 20, 30, 40}; // ํ ์ธ์จ์ด ๋ด๊ธด ๋ฐฐ์ด
int emoticonCnt = emoticons.length;
// ์ด๋ชจํฐ์ฝ ํ ์ธ ์กฐํฉ ๊ตฌํ๊ธฐ
// ์ด๋ชจํฐ์ฝ์ ๊ฐ์ ๋งํผ ์ด๋ชจํฐ์ฝ ํ ์ธ ์กฐํฉ์ ๊ตฌํด์ผ ํ๋ฏ๋ก ๋ฝ์ ์ = ์ด๋ชจํฐ์ฝ ๊ฐ์
makeComb(emoticonCnt, new int[emoticonCnt]);
return answer;
}
// toChoose: ๋ฝ์ ์, choosed: ํ ์ธ์จ ์กฐํฉ
static void makeComb(int toChoose, int[] choosed){
if(toChoose == 0){
calculate(choosed);
return;
}
for(int i = 0; i < sale.length; i++){
choosed[choosed.length-toChoose] = sale[i];
makeComb(toChoose-1, choosed);
}
}
static void calculate(int[] choosed){
int join = 0; // ํ๋ฌ์ค ํ์ ์
int sum = 0; // ๊ตฌ๋งค ์ด ํฉ
int cnt = choosed.length; // ์ด๋ชจํฐ์ฝ ๊ฐ์
int[] price = new int[cnt]; // ํ ์ธ๋ ์ด๋ชจํฐ์ฝ ๊ฐ๊ฒฉ ๋ฐฐ์ด
// ํ ์ธ๋ ์ด๋ชจํฐ์ฝ ๊ฐ๊ฒฉ ๊ตฌํ๊ธฐ
for(int i = 0; i < cnt; i++){
price[i] = emoticons[i] * (100 - choosed[i]) / 100;
}
for(int i = 0; i < users.length; i++){
int temp = 0; // ๊ตฌ๋งค ๊ฐ๊ฒฉ์ ์ด ํฉ์ ๋ด์ ๋ณ์
int ratio = users[i][0]; // ๋น์จ ์ด์์ ํ ์ธ ์ด๋ชจํฐ์ฝ์ ๊ตฌ๋งค
int min = users[i][1]; // ๊ฐ๊ฒฉ ์ด์์ ์ฌ์ฉ ์, ํ๋ฌ์ค ํ์์ผ๋ก
for(int j = 0; j < cnt; j++){
// ๋น์จ ์ด์์ ํ ์ธ ์ด๋ชจํฐ์ฝ์ธ ๊ฒฝ์ฐ ๊ตฌ๋งค
if(choosed[j] >= ratio){
temp += price[j];
}
}
// ๊ตฌ๋งค ์ด๋ชจํฐ์ฝ์ด ๊ฐ๊ฒฉ ์ด์์ธ ๊ฒฝ์ฐ ํ๋ฌ์ค ํ์
if(temp >= min){
join++;
}
// ์ดํฉ์ ๊ตฌ๋งค ๊ธ์ก ๋ํ๊ธฐ
else{
sum += temp;
}
}
// ๊ธฐ์กด ํ์ ์๋ณด๋ค ํฐ ๊ฒฝ์ฐ ๊ฐฑ์
if(answer[0] < join){
answer[0] = join;
answer[1] = sum;
}
// ํ์์๋ ๊ฐ์ผ๋ ์ดํฉ์ด ๋ ํฐ ๊ฒฝ์ฐ ๊ฐฑ์
else if(answer[0] == join){
answer[0] = join;
answer[1] = Math.max(answer[1], sum);
}
return ;
}
}
๋๊ธ