Mini

프로그래머스 이모티콘할인행사 // 중복순열, vector<pair<int,int>>정렬방법 본문

Algorithm/programmers

프로그래머스 이모티콘할인행사 // 중복순열, vector<pair<int,int>>정렬방법

Mini_96 2023. 6. 28. 23:35

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

 

프로그래머스

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

programmers.co.kr

* 중복순열 

result에 idx가 저장된다.

result[i]를 가지고 실제데이터에 접근하면된다.

ex) sale[]={10,20,30,40}

result={0,1}

saleV={10,20}

 

void permRe(){
    if(result.size()==N){
    //Logic
        for(auto i : result){
            cout<<i<<" ";
        }
       
        return;
    }
    
    for(int i=0;i<4;++i){
        result.push_back(i);
        permRe();
        result.pop_back();
    }
}

* vector<pair<int,int>>정렬방법

※ 매개변수 : pair<int,int>> v1, v2 여야함에 주의

vector<pair<int,int>> 아님!

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

"<" 정렬 ->오름차순

">" 정렬 -> 내림차순

bool cmp(pair<int,int> v1, pair<int,int> v2){
    if(v1.first==v2.first){
        return v1.second>v2.second;
    }
    return v1.first>v2.first;
}
#include <bits/stdc++.h>
using namespace std;

int _sale[]={10,20,30,40};
vector<int> result; //중복조합된 idx들 저장
vector<int> saleV;
vector<pair<int,int>> ret;
vector<vector<int>> Users;
vector<int> Emoticons;
int N;

void buy(){
    int allSum=0;
    int service=0;
    for(auto user:Users){
        int sum=0;
        bool flag=0;
        for(int j=0;j<Emoticons.size();++j){
            if(user[0]<=saleV[j]){
                sum+=Emoticons[j]/100*(100-saleV[j]);
            }
            if(sum>=user[1]){
                service++;
                flag=1;
                break;
            }
        }
        if(!flag){
            allSum+=sum;
        }
    }
    ret.push_back({service,allSum});
    
}
 //1. 이모티콘할인율 중복조합 10,20,30,40
void permRe(){
    if(result.size()==N){
        /*for(auto i : result){
            cout<<i<<" ";
            //cout<<sale[i]<<" ";
        }
        cout<<endl;*/
        
        
        //1. 이모티콘별 할인율 저장
        //saleV[0] == 이모티콘0번 할인율
        for(auto a: result){
            //cout<<_sale[a]<<" ";
            saleV.push_back(_sale[a]);
        }
        
        
        
        //2. 할인율이상->구매
        buy();
        saleV.clear();
        return;
    }
    
    for(int i=0;i<4;++i){
        result.push_back(i);
        permRe();
        result.pop_back();
    }
}
bool cmp(pair<int,int> v1, pair<int,int> v2){
    if(v1.first==v2.first){
        return v1.second>v2.second;
    }
    return v1.first>v2.first;
}
vector<int> solution(vector<vector<int>> users, vector<int> emoticons) {
    vector<int> answer;
    N=emoticons.size();
    Users=users; Emoticons=emoticons;    
    //for(auto i : sale) cout<<i<<" ";
    //1. 이모티콘할인율 조합 10,20,30,40
    permRe();
    
    //2. 할인율이상->구매
    //3. 가격보다크면 -> 서비스가입
    //4. 그때의 서비스가입,판매값 push
    
    
    //5. 정렬(기준 : 서비스가입수, 같으면 점수순)
    sort(ret.begin(),ret.end(),cmp);
    for(auto p : ret){
        cout<<p.first<<" "<<p.second<<endl;
    }
    
    
    //6. answer.push(마지막)
    
    answer.push_back(ret[0].first);
    answer.push_back(ret[0].second);
    
    return answer;
}