📖 문제

level3 불량 사용자

✏️ 나의 풀이

우선 정규식을 이용해 불량 사용자와 매칭 되는 사용자를 찾을 수 있도록 작성하였다.

또한, 불량 사용자의 길이도 같이 만들어두어 길이와 정규식을 이용하였다.

const [reg, len] = [
          new RegExp(`${ban.replace(/\*/g, ".")}`),
          ban.length,
        ];

정규식을 이용해 길이까지 한번에 할 수도 있겠지만, 정규식에 대해 잘 알지 못해 우선은 이런식으로 작성하였다.

그 다음, 불량 사용자 아이디 목록에 해당하는 사용자 아이디를 하나의 배열로 선언해주었다.

const answer = banned_id.map((ban) => {
    const [reg, len] = [
        new RegExp(`${ban.replace(/\*/g, ".")}`),
        ban.length,
    ];
    return (user_id.map((user) => {
        if (user.length !== len) return false;
        const r = reg.test(user);
        return r ? user : false;
    }).filter((v) => v));
}).sort((a, b) => b.length - a.length);

그 다음은 dfs를 이용해 경우의 수를 구해주었다.

const test = new Set();

const dfs = (index, visited) => {
    if (index === answer.length) {
        test.add(visited.sort().join(""));
        return true;
    }
    const res = [];
    for (let i = 0; i < answer[index].length; i++) {
        if (visited.includes(answer[index][i])) continue;
        const newVisited = [...visited, answer[index][i]];
        dfs(index + 1, newVisited);
    }
    return res;
};

dfs를 이용해 가장 마지막 index에 접근하였을때 불량 아이디 수만큼의 제재 아이디 수를 visited에 갖고 있기에

if (index === answer.length) {
    test.add(visited.sort().join(""));
    return true;
}

위와 같이 test 변수에 visited에 있는 모든 값들을 정렬후 문자열로 만들어 추가해두었다.

이렇게 하면 이전에 다른 순서로 test 변수에 있더라도 test 변수는 set 자료형이기에 중복은 자동적으로 제거된다.

👩‍💻 코드

function solution(user_id, banned_id) {
    const answer = banned_id
      .map((ban) => {
        const [reg, len] = [
          new RegExp(`${ban.replace(/\*/g, ".")}`),
          ban.length,
        ];
        return user_id
          .map((user) => {
            if (user.length !== len) return false;
            const r = reg.test(user);
            return r ? user : false;
          })
          .filter((v) => v);
      })
      .sort((a, b) => b.length - a.length);
    const test = new Set();
    const dfs = (index, visited) => {
      if (index === answer.length) {
        test.add(visited.sort().join(""));
        return true;
      }
      const res = [];
      for (let i = 0; i < answer[index].length; i++) {
        if (visited.includes(answer[index][i])) continue;
        const newVisited = [...visited, answer[index][i]];
        dfs(index + 1, newVisited);
      }
      return res;
    };
    const r = dfs(0, []);
    return test.size;
  }

댓글남기기