개발자 김수진

[프로그래머스] 불량 사용자(C++) 본문

카테고리 없음

[프로그래머스] 불량 사용자(C++)

김수진장 2021. 4. 27. 16:51

[문제]

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

 

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

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

programmers.co.kr

[풀이]

 

각각의 banned_id마다 가능한 user_id의 index를 vector에 push

DFS를 통해 banned_id마다 제재 id를 구한다.

banned_id에 대해 user ID를 모두 선택했을 경우, 선택된 user ID의 index로 문자열을 만들어 set에 insert해준다.

set을 통해 중복된 경우를 제거하여 모든 경우의 수를 구할 수 있다.

 

[코드]

 

#include <string>
#include <vector>
#include <set>
#define MAX 8

using namespace std;

vector<int> v[MAX];
set<string> s;
bool visited[MAX]={0,};
int bsize= 0;
int usize=0;
int res= 0;

void DFS(int cnt,int idx)
{
    if(cnt == bsize)
    {
        string tmp="";
        for(int i=0;i<usize;i++){
            if(visited[i])  tmp+=to_string(i);
        }
        s.insert(tmp);
        return ;
    }
    for(int i=0;i<v[idx].size();i++)
    {
        int num = v[idx][i];
        if(visited[num])    continue;
        visited[num]=true;
        DFS(cnt+1, idx+1);
        visited[num] = false;
    }
}

int solution(vector<string> user_id, vector<string> banned_id) {
    int answer = 0;
    bsize= banned_id.size();
    usize= user_id.size();
    for(int i=0;i<bsize;i++)
    {
        int len1= banned_id[i].size();
        for(int j=0;j<user_id.size();j++)
        {
            int len2 = user_id[j].size();
            if(len1 != len2)    continue;
            bool check = true;
            for(int k=0;k<len1;k++){
                if(banned_id[i][k] == '*')  continue;
                if(banned_id[i][k] != user_id[j][k]){
                    check = false;
                    break;
                }
            }
            if(check)   v[i].push_back(j);            
        }   
    }

    DFS(0,0);
    answer = s.size();
    return answer;
}