프로그래머스: 불량 사용자 [JS]

Song-Minhyung·2022년 12월 1일
0

Problem Solving

목록 보기
40/50
post-thumbnail

문제

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;
}
profile
기록하는 블로그

0개의 댓글