https://school.programmers.co.kr/learn/courses/30/lessons/64064
이벤트 개발을 담당하는 무지는 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자를 발견했다.
이를불량 사용자
라는 목록을 만들어 당첨시 제외하도록 프로도에게 전하려 한다.
개인정보 보호를 위해 일부 문자를 *문자로 가려서 전달했다.
불량 사용자 목록에 매핑된 응모자 아이디는제재 아이디
라고 부르기로 했따.
이 때 당첨에서 제외되야할 제대 아이디 목록은 몇가지 경우인지 return해라
문제 아래부분을 보면 어떻게 풀어야 할지 방법이 나와있다.
이벤트 응모자 아이디 목록이 담긴 배열 user_id와 불량 사용자 아이디 목록이 담긴 배열 banned_id가 매개변수로 주어질 때, 당첨에서 제외되어야 할 제재 아이디 목록은
몇가지 경우의 수가 가능한 지
return 하도록 solution 함수를 완성해주세요.
몇가지 경우의 수가 가능한지 리턴을 해야한다.
경우의 수는 조합
, 순열
로 구할 수 있는데 이 문제에선 순열
을 써야한다.
그 이유는 1, 2, 3이 있을 때 2가지를 고르라 하면 1, 2도 가능하고 2, 1도 가능한데
순열로 구한 두명의 사용자와 banned_id는 1:1로 매칭이 되기 때문이다.
그래서 처음으로 할건 순열을 구하고
그 후에 구한 수열을 banned_id와 매칭시켜서
만약 순열안의 모든 사용자가 매칭 된다면 해당 순열을 result에 추가한다.
근데 이때 중복된 순열이 들어갈수도 있으므로 순열을 string
으로 변환후 Set
에 넣어줬다.
function solution(user_id, banned_id) {
const getPermu = (arr, rst) => {
if (arr.length === banned_id.length) rst.push(arr);
for (let i = 0; i < user_id.length; i++) {
if (!arr.includes(user_id[i])) {
getPermu([...arr, user_id[i]], rst);
}
}
return rst;
};
const permus = getPermu([], []);
const result = new Set();
permus.forEach(permu => {
let bannedUserCnt = 0;
for (let i = 0; i < permu.length; i++) {
const replaceBanned = banned_id[i].replaceAll('*', '.');
const reg = new RegExp(`^${replaceBanned}$`);
if (reg.test(permu[i])) bannedUserCnt++;
}
if (bannedUserCnt === banned_id.length) result.add(permu.sort().join(''));
});
return result.size;
}