๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
    <
Algorithm

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/์ž๋ฐ”(Java)] ์ด๋ชจํ‹ฐ์ฝ˜ ํ• ์ธํ–‰์‚ฌ

by yeeeh 2023. 1. 17.

๐Ÿ“ ๋ฌธ์ œ ๋งํฌ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ด๋ชจํ‹ฐ์ฝ˜ ํ• ์ธํ–‰์‚ฌ ๋ฌธ์ œ๋ฅผ ์ž๋ฐ”๋กœ ํ’€์ดํ–ˆ์Šต๋‹ˆ๋‹ค.

 

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

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

๐Ÿ“ ๋ฌธ์ œ ํ’€์ด

 

๋ฌธ์ œ์—์„œ ์ œ์‹œ๋œ ๋ชฉํ‘œ์™€ ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

[๋ชฉํ‘œ]

  1. ์ด๋ชจํ‹ฐ์ฝ˜ ํ”Œ๋Ÿฌ์Šค ์„œ๋น„์Šค ๊ฐ€์ž…์ž๋ฅผ ์ตœ๋Œ€ํ•œ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ
  2. ์ด๋ชจํ‹ฐ์ฝ˜ ํŒ๋งค์•ก์„ ์ตœ๋Œ€ํ•œ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ. (1๋ฒˆ ๋ชฉํ‘œ๊ฐ€ ์šฐ์„ , ๊ทธ ๋‹ค์Œ 2๋ฒˆ ๋ชฉํ‘œ)

[์กฐ๊ฑด]

  1. ์ด๋ชจํ‹ฐ์ฝ˜ ํ• ์ธ์œจ์€ 10%, 20%, 30%, 40% ๋กœ ์ด 4๊ฐ€์ง€
  2. ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์˜ ๊ธฐ์ค€ ๋น„์œจ ์ด์ƒ์œผ๋กœ ํ• ์ธํ•˜๋Š” ์ด๋ชจํ‹ฐ์ฝ˜ ๊ตฌ๋งคํ•˜๊ณ , ๊ธฐ์ค€ ๊ฐ€๊ฒฉ ์ด์ƒ์ธ ๊ฒฝ์šฐ ํ”Œ๋Ÿฌ์Šค ์„œ๋น„์Šค ๊ฐ€์ž…

๋‚ด๊ฐ€ ๋– ์˜ฌ๋ฆฐ ๋ฐฉ๋ฒ•์€ ๋ฌธ์ œ์—์„œ ์ œ์‹œ๋œ ์กฐ๊ฑด๊ณผ ๋ชฉํ‘œ๋ฅผ ๊ทธ๋Œ€๋กœ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค.

 

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 ;
    }
}

๋Œ“๊ธ€