[프로그래머스/자바스크립트(JavaScript)] 불량 사용자

https://programmers.co.kr/learn/courses/30/lessons/64064?language=javascript

문제 풀이 ✍️

주어진 user_id 배열을 이용하여 모든 순열을 구해줍니다.

조합을 구할 경우 순서를 따지기 때문에 X

해당 순열들과 banned_id 를 한 글자씩 비교하며 정답 배열에 넣어줍니다.

여기서 Set을 이용해야 합니다.

순열을 사용할 경우
["*rodo", "*rodo", "******"] 구조는

  • ["frodo", "crodo", "frodoc"]
  • ["crodo", "frodo", "frodoc"]

위 2가지 경우를 모두 포함 시키기 때문에 중복되는 값이
결과 배열에 들어가기 때문입니다.

따라서 정답 배열을 정렬 후 join을 통해 "frodocrodofrodoc" 형식으로 바꾼뒤
Set에 담아주면 알아서 중복을 걸러줍니다.


function solution(user_id, banned_id) {
  // 순열
  const permutation = (arr, selectNum) => {
    let result = [];
    if (selectNum === 1) return arr.map((item) => [item]);

    arr.forEach((num, curIndex, array) => {
      const fixed = num;
      const restArr = array.filter((item, index) => curIndex !== index);
      const restPermutation = permutation(restArr, selectNum - 1);
      const fixedPermutation = restPermutation.map((item) => [fixed, ...item]);

      result.push(...fixedPermutation);
    });

    return result;
  };

  const check = (users) => {
    for (let i = 0; i < banned_id.length; i++) {
      if (users[i].length !== banned_id[i].length) return false;
      else {
        for (let j = 0; j < users[i].length; j++) {
          if (banned_id[i][j] === "*") continue;

          if (users[i][j] !== banned_id[i][j]) return false;
        }
      }
    }
    return true;
  };

  const userSet = permutation(user_id, banned_id.length);

  // set 사용 중복 제거
  const results = new Set([]);
  userSet.forEach((users) => {
    if (check(users)) {
      results.add(users.sort().join(""));
    }
  });

  return results.size;
}

좋은 웹페이지 즐겨찾기