프로그래머스/3레벨
[프로그래머스/C++] 불량 사용자
Koalitsiya
2024. 4. 16. 15:47
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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();
}