백트래킹 - 카카오 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);
}
Author And Source
이 문제에 관하여(백트래킹 - 카카오 2019 인턴 : 불량사용자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@kwt0124/백트래킹-카카오-2019-인턴-불량사용자
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
존재할 경우 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);
}
Author And Source
이 문제에 관하여(백트래킹 - 카카오 2019 인턴 : 불량사용자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kwt0124/백트래킹-카카오-2019-인턴-불량사용자저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)