알고리즘/프로그래머스

2019카카오 인턴쉽 - 불량 사용자

https://programmers.co.kr/learn/courses/30/lessons/64064#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

  • 금지된 아이디가될 가능성이 있는 user_id를 찾아서 vector를 만든다
  • 만들어 놓은 vector를 재귀함수와 비트마스크를 이용하여 중복되지 않게 만든다

중요 개념

1001 | 0110 -> 1111

1001 & 0110 -> 0000

 

1<<3  -> 1000   1을 왼쪽으로 3만큼 이동

1000>>3  -> 1   1을 오른쪽으로 3만큼 이동

bool visited[1 << 8]  ->  배열크기가 2^8이다. 왜? 1을 8만큼 이동하고 10진법으로 바꿨기 때문.

비트마스크 관련 링크

https://mygumi.tistory.com/361

 

비트마스크(BitMask) 는 무엇인가? :: 마이구미

이 글은 비트마스크(BitMask) 기법에 대해 다룬다. 특정 알고리즘이 아닌, bit 를 활용한 테크닉이라고 할 수 있다. bit 는 low level 이 아닌 경우에는 크게 비트를 다룰 일은 없어보이지만, 분명 이해가 필요한..

mygumi.tistory.com

 

#include<iostream>
#include <string>
#include <vector>
using namespace std;
bool visited[1 << 8];
void dfs(int bannedIdx, int N,int bit ,const vector<vector<int>>& candi)
{
    if (N == bannedIdx)
    {
        visited[bit] = true;
        return;
    }
    for (auto p : candi[bannedIdx]) {
        if (bit & (1 << p)) continue;
        dfs(bannedIdx+1, N, bit|(1<<p), candi);
    }
}

bool check(string b, string u) {
    if (b.size() != u.size()) return false;
    for (int i = 0; i < b.size(); i++) {
        if (!(b[i] == u[i] || b[i] == '*' || u[i] == '*')) {
            return false;
        }
    }
    return true;
}

int solution(vector<string> user_id, vector<string> banned_id) {
    int answer = 0;
    vector<vector<int>> candi(banned_id.size());
    for (int i = 0; i < banned_id.size(); i++) {
        for (int j = 0; j < user_id.size(); j++) {
            if (check(banned_id[i], user_id[j])) {
                candi[i].push_back(j);
            }
        }
    }
    dfs(0, banned_id.size(),0 ,candi);
    for (int i = 0; i < (1 << 8); i++) {
        if (visited[i])
            answer++;
    }
    return answer;
}

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