코딩테스트

2023 카카오 블라인드 채용 이모티콘 행사 c++ (브루트 포스)

코앤미 2023. 7. 17. 12:23

 

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

제한 사항에서 이모티콘은 최대 8개, 할인의 종류는 4개이다. 8개 이모티콘에 대한 모든 할인의 경우의 수는 

4*4*....*4 = 4^8 만큼의 경우의 수를 구하면 된다.

이 4개의 할인 경우의 수를 0,1,2,3 이라는 캐릭터에 담아서, 8자리 문자열에 저장하는 것으로 경우의 수를 표현했다.

ex) 01010101 -> 1째 == 10%,2째 == 20%,....8째 == 20% 

dfs를 통해 가능한 모든 문자열을 생성한 뒤, 모든 경우의 수에 대해 총 이익, 구독자 수를 구하면서 최대 구독자, 최대 이익을 찾으면 된다.

 

#include <string>
#include <vector>

using namespace std;
vector<vector<int>> all;
int saleArr[4]={10,20,30,40};
int siz=0;
void make_posibility(vector<int> v){
    if(v.size()==siz){
            all.push_back(v);
            return;
    }
    for(int i=0;i<4;i++){
        v.push_back(i);
        make_posibility(v); 
        v.pop_back();
    }
}
vector<int> solution(vector<vector<int>> users, vector<int> emoticons) {
    vector<int> answer;
    siz=emoticons.size();
    vector<int> tmp;
    make_posibility(tmp);
    int max_sub=-1,max_total=-1;
    for(int p=0;p<all.size();p++){//확률 가짓수
        vector<int> sale=all[p];
        int sub=0, total=0;
        for(int i=0;i<users.size();i++){//각 유저가 해당 세일 상황에서 행동
            int my_sum=0,my_sale=users[i][0],max=users[i][1];
            for(int s=0;s<siz;s++){
                int saleNum=saleArr[sale[s]];
                if(saleNum<my_sale) continue;
                int sale_price=(emoticons[s]/100)*(100-saleNum);
                my_sum+=sale_price;  
                if(my_sum>=max){ //예산 초과 시 모두 취소 후 구독
                    my_sum=0;
                    sub++;
                    break;   
                }
            }
            total+=my_sum;
        } 
        if(max_sub<sub){
            max_sub=sub;
            max_total=total;
        }
        if(max_sub==sub&&max_total<total) max_total=total;    
    }
    answer.push_back(max_sub);
    answer.push_back(max_total);
    return answer;
}