[c++] 2019 ์นด์นด์˜ค ๊ฐœ๋ฐœ์ž ๊ฒจ์šธ ์ธํ„ด์‹ญ :: ๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž

๋ฌธ์ œ

๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž

๊ฐœ๋ฐœํŒ€ ๋‚ด์—์„œ ์ด๋ฒคํŠธ ๊ฐœ๋ฐœ์„ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ๋Š” "๋ฌด์ง€"๋Š” ์ตœ๊ทผ ์ง„ํ–‰๋œ ์นด์นด์˜ค์ด๋ชจํ‹ฐ์ฝ˜ ์ด๋ฒคํŠธ์— ๋น„์ •์ƒ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹น์ฒจ์„ ์‹œ๋„ํ•œ ์‘๋ชจ์ž๋“ค์„ ๋ฐœ๊ฒฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‘๋ชจ์ž๋“ค์„ ๋”ฐ๋กœ ๋ชจ์•„ ๋ถˆ๋Ÿ‰

programmers.co.kr

 

ํ’€์ด

์ฒ˜์Œ์—๋Š” ์ œ์žฌ ์•„์ด๋”” ๋‹น ๋ช‡ ๊ฐ€์ง€์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ง€ ๊ณ„์‚ฐํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜, ์ด๋ ‡๊ฒŒ ํ•œ๋‹ค๋ฉด ๊ธฐ์กด์— ์ œ์žฌ ์•„์ด๋””์— ๊ฑธ๋ฆฐ ์•„์ด๋””๋Š” ๋‹ค์‹œ๊ธˆ ํŒ๋‹จํ•˜๋ฉด ์•ˆ๋˜๋Š” ๋“ฑ ์ƒ๊ฐํ•ด์•ผ ํ•  ๋ฌธ์ œ๊ฐ€ ๋งŽ์•„์ง€๋ฏ€๋กœ ์•„๋ž˜์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ œ์žฌ ์•„์ด๋””์™€ ๋งค์นญ๋˜๋Š” ์•„์ด๋””๋ฅผ ์ฐพ์„๋•Œ๋งˆ๋‹ค dfs๋กœ ๋Œ๋ฉด์„œ ๋ชจ๋“  ์ œ์žฌ ์•„์ด๋””์— ๋งค์นญ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ฐพ์œผ๋ฉด ๋œ๋‹ค. ์ž…๋ ฅ์˜ ๋ฒ”์œ„๊ฐ€ ์ž‘์•„์„œ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๋ฌธ์ œ ์—†๋‹ค. ๋”ํ•ด์„œ ์ˆœ์—ด์ด ์•„๋‹ˆ๋ผ ์กฐํ•ฉ์ด๋ฏ€๋กœ ์ˆœ์„œ์— ๊ด€๊ณ„์—†์ด ํ•˜๋‚˜์˜ ๊ฒฝ์šฐ๋กœ ์น˜๋ถ€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฑธ ๋ช…์‹ฌํ•˜์ž!

 

 

์ฝ”๋“œ

#include <string>
#include <vector>
#include <regex>
#include <algorithm>
#include <unordered_set>

using namespace std;

vector<string> bannedIdList;
unordered_set<int> answer;
unordered_map<string, int> mappedList;
int powList[8] = {1,2,4,8,16,32,64,128};

string convertBannedId(string bannedId){
    auto foundIdx = bannedId.find("*");
    while(foundIdx != string::npos){
        bannedId[foundIdx] = '.';
        foundIdx = bannedId.find("*");
    }
    return bannedId;
}

void dfs(vector<string>& userIdList, int bannedIdx, int bitSum){
    if(bannedIdx == bannedIdList.size()){ // ๋ชจ๋“  ์ œ์žฌ ์•„์ด๋”” ๊ฒ€์‚ฌ ์™„๋ฃŒ
        answer.insert(bitSum); // ์™„๋ฃŒํ•œ bitSum ์ €์žฅ (์ˆœ์„œ ๋ฐ”๋€Œ์–ด๋„ ๊ฐ™์€ ๊ฒฝ์šฐ ์ฒดํฌ ๊ฐ€๋Šฅ)
        return;
    }
    
    string bannedId = bannedIdList[bannedIdx];
    regex re(bannedId);
    
    for(int i=0; i<userIdList.size(); i++){
        if(regex_match(userIdList[i], re)){ // ์ œ์žฌ ์•„์ด๋””์— ํ•ด๋‹นํ•œ๋‹ค๋ฉด
            string tmp = userIdList[i];  
            userIdList.erase(userIdList.begin()+i); // ํ•ด๋‹น ์•„์ด๋””๋ฅผ ์ œ์™ธํ•˜๊ณ 
            dfs(userIdList, bannedIdx + 1, bitSum + mappedList[tmp]); // ๋‹ค์Œ ์ œ์žฌ ์•„์ด๋”” ์ถ”์ 
            userIdList.insert(userIdList.begin() + i, tmp);
        }
    }
}

int solution(vector<string> userIdList, vector<string> banned_id_list) {
    for(int i=0; i<banned_id_list.size(); i++){ // ์ฃผ์–ด์ง„ ๋ฆฌ์ŠคํŠธ * => .๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ regex์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ
        bannedIdList.push_back(convertBannedId(banned_id_list[i]));
    }
    for(int i=0; i<userIdList.size(); i++){ // userId์™€ 2์˜ ์ง„์ˆ˜๋“ค ๋งคํ•‘
        mappedList[userIdList[i]] = powList[i];
    }
    dfs(userIdList, 0, 0);
    
    return answer.size();
}

 

๊ฒฐ๊ณผ

ํ…Œ์ŠคํŠธ 1 ใ€‰ ํ†ต๊ณผ (0.02ms, 4.32MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰ ํ†ต๊ณผ (0.05ms, 3.71MB)
ํ…Œ์ŠคํŠธ 3 ใ€‰ ํ†ต๊ณผ (0.04ms, 3.72MB)
ํ…Œ์ŠคํŠธ 4 ใ€‰ ํ†ต๊ณผ (0.05ms, 4.32MB)
ํ…Œ์ŠคํŠธ 5 ใ€‰ ํ†ต๊ณผ (101.91ms, 4.27MB)
ํ…Œ์ŠคํŠธ 6 ใ€‰ ํ†ต๊ณผ (0.96ms, 4.33MB)
ํ…Œ์ŠคํŠธ 7 ใ€‰ ํ†ต๊ณผ (0.05ms, 4.26MB)
ํ…Œ์ŠคํŠธ 8 ใ€‰ ํ†ต๊ณผ (0.06ms, 4.33MB)
ํ…Œ์ŠคํŠธ 9 ใ€‰ ํ†ต๊ณผ (0.06ms, 4.27MB)
ํ…Œ์ŠคํŠธ 10 ใ€‰ ํ†ต๊ณผ (0.05ms, 4.27MB)
ํ…Œ์ŠคํŠธ 11 ใ€‰ ํ†ต๊ณผ (0.07ms, 3.84MB)
๋ฐ˜์‘ํ˜•