#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
void DFS(vector<vector<int>> vecVecInt, vector<vector<int>>& vecVecAnswer,vector<int> vecInt, int iNumber)
{
    // 마지막 번호가 입력되고 또 들어왔다면
    if (iNumber == vecVecInt.size())
    {
        // 해당하는 vec가 또 있을 수 있으니 sort
        sort(vecInt.begin(), vecInt.end());
 
        // 배열이 비어 있지 않다면 있는지 확인
        if (!vecVecAnswer.empty())
        {
            for (int i = 0; i < vecVecAnswer.size(); ++i)
            {
                if (vecVecAnswer[i] == vecInt)
                    return;
            }
        }
 
        // 확인 후 없다면 입력
        vecVecAnswer.push_back(vecInt);
 
        return;
    }
 
    for (int i = 0; i < vecVecInt[iNumber].size(); ++i)
    {
        // 처음일 경우 확인 없이 바로 입력
        if (!iNumber)
        {
            vecInt[iNumber] = vecVecInt[iNumber][i];
            DFS(vecVecInt, vecVecAnswer, vecInt, iNumber + 1);
        }
 
        else
        {
            // 이전에 같은 번호가 있는지 확인
            for (int j = 0; j < iNumber; ++j)
            {
                if (vecInt[j] == vecVecInt[iNumber][i])
                    break;
 
                // 없다면 입력
                else if (j == iNumber - 1)
                {
                    vecInt[iNumber] = vecVecInt[iNumber][i];
                    DFS(vecVecInt, vecVecAnswer, vecInt, iNumber + 1);
                }
 
            }
        }
    }
}
 
int solution(vector<string> user_id, vector<string> banned_id)
{
    int iStarCount = 0;
    // 해당하는 userId의 배열 번호를 넣기 위한 배열
    vector<vector<int>> vecVecInt(banned_id.size());
    // 해당하는 배열을 사용하기 위한 용도
    vector<vector<int>> vecVecAnswer = {};
    vector<int> vecSelect(banned_id.size(), -1);
 
    for (int i = 0; i < banned_id.size(); ++i)
    {
        for (int z = 0; z < user_id.size(); ++z)
        {
            // 크기가 다를 경우 바로 패스
            if (user_id[z].size() != banned_id[i].size())
                continue;
 
            for (int j = 0; j < user_id[z].size(); ++j)
            {
                if (banned_id[i][j] == '*')
                {
                    // 별의 수 체크
                    ++iStarCount;
 
                    // 별이고 모든 글씨가 별이 아닐 경우 패스
                    if (j != user_id[z].size() - 1)
                        continue;
 
                    // 모든 글씨가 별일 경우 입력
                    else
                    {
                        vecVecInt[i].push_back(z);
                        break;
                    }
                }
 
                // 글이 다르다면 패스
                if (user_id[z][j] != banned_id[i][j])
                    break;
 
                // 마지막까지 같다면 입력
                if (j == user_id[z].size() - 1)
                    vecVecInt[i].push_back(z);
            }
        }
 
        iStarCount = 0;
    }
 
    // 아예 해당하는 게 없다면 조건이 안되므로 패스
    for (int i = 0; i < vecVecInt.size(); ++i)
    {
        if (vecVecInt[i].empty())
            return 0;
    }
 
    // 하나하나 체크하기
    DFS(vecVecInt, vecVecAnswer, vecSelect, 0);
 
    return vecVecAnswer.size();
}

완전탐색해야한다!

+ Recent posts