백트래킹 - 카카오 2019 인턴 : 불량사용자

풀이전략

  • 중복 처리를 어떻게 할것이냐가 관건이다.
  • ban에 fod, *rodo 가 있어서 user의 frodo - crodo 순서만 바꿔서 중복으로 선택할 수 있는데 이를 어떻게 처리할 것이냐가 관건이다.
    존재할 경우 1로 string에 + 하고, 존재하지 않다면 + 0으로 set에 삽입하는 방식으로 처리했다.

소스코드

#include <string>
#include <vector>
#include <set>
using namespace std;

set<string>s;
vector<bool>check(8, false);

//문자열을 비교하는 함수
bool Compare(string& a, string& b)
{
    //사이즈 비교
    if(a.length() != b.length())
        return false;
    
    //한글자씩 비교 
    for(int i = 0; i < a.length(); i++)
    {
        if(b[i] == '*')
            continue;
        
        if(a[i] != b[i])
        {
            return false;
        }
    }
    
    
    return true;
}

//백트래킹 
//1) 종료 조건을 만들자.
//2) 불변수 바로 갱신하기 
void dfs(vector<string>&user, vector<string>&ban , int targetIdx)
{
    //종료 조건을 만들자.
    if(targetIdx >= ban.size())
    {
        //어떤 컨테이너에다가 저장해놓아야 한다. 
        //user_id의 위치를 string화해서 중복처리를 방지하는 부분이다.
        string tmp = "";
        for(int j = 0; j < check.size(); j++)
        {
            if(check[j] == true)
            {
                tmp += to_string(j);
            }
        }
        
        s.insert(tmp);
        
        
        return;
    }
    
    
    for(int i = 0; i < user.size(); i++)
    {
        if(check[i] == false && Compare(user[i], ban[targetIdx]))
        {
            check[i] = true;
            //참이면 targetIdx를 증가해서 재귀하자.
            dfs(user, ban, targetIdx + 1);
            check[i] = false;
        }
    }
    
    
}



int solution(vector<string> user_id, vector<string> banned_id) {
    int answer = 0;
    
    //백트래킹 함수를 만들자.
    dfs(user_id, banned_id, 0);
    answer = s.size();
    
    return answer;
}

int main()
{
	vector<string>v1 = { "frodo", "fradi", "crodo", "abc123", "frodoc" };
	vector<string>v2 = { "fr*d*", "abc1**" };
	cout << solution(v1, v2);


}




좋은 웹페이지 즐겨찾기