프로그래머스

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

programmers.co.kr

 

 

#include <string>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;

/*
순열을 통해 조합을 만들고 해당 조합에서 banned_id의 크기만큼 아이디를 선택하여 조건을 만족하는지 체크
이후 조건을 만족하는 아이디들의 크기가 banned_id와 같으면 set에 저장(중복 제거)
*/

set<string> s;

// 조건 체크
// a가 banned_id, b가 조건 체크할 id
bool isBanned(string a, string b) {
    if(a.length() == b.length()) {
        for(int i = 0; i < a.length(); i++) {
            if(a[i] == b[i] || a[i] == '*')
                continue;
            else 
                return false;
        }
    }
    else
        return false;
    
    return true;
}

int solution(vector<string> user_id, vector<string> banned_id) {
    // 순열 사용을 위해 정렬
    sort(user_id.begin(), user_id.end());
    
    do {
        vector<string> v;
        string str = "";
        
        // 조건 체크
        for(int i = 0; i < banned_id.size(); i++)
            if(isBanned(banned_id[i], user_id[i]))
                v.push_back(user_id[i]);
        
        // banned_id.size()만큼의 id가 조건을 충족했다면
        if(banned_id.size() == v.size()) {
            // 순서가 관계 없어야하기 때문에 정렬
            sort(v.begin(), v.end());
            
            for(auto& e : v)
                str += e;
            
            s.insert(str);
        }
        
    } while(next_permutation(user_id.begin(), user_id.end()));
    
    return s.size();
}

+ Recent posts