[JavaScript][Programmers] 불량 사용자

조준형·2021년 8월 7일
0

Algorithm

목록 보기
57/142
post-thumbnail

🔎 불량 사용자

❓ 문제링크

https://programmers.co.kr/learn/courses/30/lessons/64064

📄 제출 코드

function solution(user_id, banned_id) {
    dfs(user_id, banned_id, []);
    let temp = [];
    arr.forEach(el => {
        temp.push(el.sort().join());
    })
    console.log(new Set(temp))
    let answer = new Set(temp).size
    return answer;
}
let arr = [];
function dfs(user_id, banned_id, ban) {
    // console.log(`user : ${user_id}, ban : ${banned_id}, ban : ${ban}`);
    if (banned_id.length == 0) { arr.push(ban);}
    else {
        for (let i = 0; i < user_id.length; i++) {
            if (match(user_id[i], banned_id[0])) {
                dfs([...user_id.slice(0, i), ...user_id.slice(i + 1)], banned_id.slice(1), [...ban, user_id[i]])
            }
        }
    }
}
function match(userid, banid) {
    let u_len = userid.length;
    let b_len = banid.length;
    let chk = 0;
    if (u_len != b_len) return false;
    for (let i = 0; i < b_len; i++) {
        if (banid[i] == '*' || banid[i] == userid[i]) chk++;
        else return false;
    }
    if(chk==b_len) return true;
}
let user_id = ["frodo", "fradi", "crodo", "abc123", "frodoc"];
let banned_id = ["*rodo", "*rodo", "******"];
console.log(solution(user_id, banned_id));

처음에 조합을 생각하고, 담아둔 배열을 match를 해서 true면 다음 dfs돌리고 마지막에 담긴 arr에 중복을 제거하고 결과를 리턴해야겠다고 생각했다.

먼저, match부터 작성하였고, 중복을 작성하는데 구현하다가 막혀서 결국 다른 코드를 보게되었다.
banned_id를 다 탐색했으면, arr에다 결과를 push하고, match가 true일 때 다시 dfs를 돌렸다.
마지막에 중복제거를 하는데 그냥 new Set(arr)을 했더니 내가 생각한거 처럼 되지 않았다.
그래서 dfs를 참고한 곳에서도 같은 고민을 했던것을 확인했습니다.
그래서 이 문제를 해결하기 위해 arr의 요소들을 우선 정렬하고, 그것들을 join을 하면 c,a,b / b,a,c가 a,b,c로 정렬되고 Set에 저장하면 중복이 제거가 됩니다.
그래서 마지막에 Set의 크기를 출력하면 정답이 나왔습니다.

match를 할때 정규표현식을 이용하는 방법도 있음.

📘 참고

https://velog.io/@jeky22/javascript-프로그래머스-불량-사용자

profile
깃허브 : github.com/JuneHyung

0개의 댓글