본문 바로가기

알고리즘 문제풀이

[프로그래머스] 2019카카오 겨울 인턴십 - 불량 사용자

오늘 푼 문제

 

3. 불량 사용자/ Lv.3 / 시간 : 78분

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

 

코딩테스트 연습 - 불량 사용자

개발팀 내에서 이벤트 개발을 담당하고 있는 "무지"는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량

programmers.co.kr

function solution(user_id, banned_id) {
    var answer = 0;
    let temp = banned_id.reduce((acc,cur)=>{
        let tempList = user_id.reduce((acc2,cur2)=>{
            if(cur.length!==cur2.length) return acc2;
            for(let j=0;j<cur.length;j++){
                if((cur[j]!=="*")&&(cur[j]!==cur2[j])) return acc2;
            }
            acc2.push(cur2);
            return acc2;
        },[]);
        acc.push(tempList)
        return acc;
    },[]);
    
    let list = [];
    temp.forEach((arr,i)=>{
        let target = i? list[i-1] : null;
        list[i] = [];
        arr.forEach(v=>{
            if(target) target.forEach(old=>{
                let news = new Set(old)
                news.add(v);
                if(news.size===(i+1)) list[i].push(news);
            });
            else list[i].push(new Set([v]));
        })
    })
    answer = new Set(list[list.length-1].map(s=>[...s].sort().reduce((acc,cur)=>acc+cur,""))).size

    return answer;
}

 

문제 풀이 핵심

1. 각 banned_id 별로 매핑 가능한 user_id 들의 배열을 추출

2. user_id 배열들로 중복 없이 생성 가능한 조합의 개수를 구함.

3. 모든 조합을 구하면 최대 8의 8제곱까지 연산이 들어가기 때문에 중간에 set을 사용해서 중복 제거로 불필요한 연산을 줄일 필요가 있다.