Hello Ocean! ๐ŸŒผ

[C++/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž ๋ณธ๋ฌธ

Algorithm

[C++/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž

bba_dda 2021. 12. 29. 23:47
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

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

 

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

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

programmers.co.kr

์ด๋ฒคํŠธ ์‘๋ชจ์ž ์•„์ด๋”” ๋ชฉ๋ก์ด ๋‹ด๊ธด ๋ฐฐ์—ด user_id์™€

๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž ์•„์ด๋”” ๋ชฉ๋ก์ด ๋‹ด๊ธด ๋ฐฐ์—ด banned_id๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ,

๋‹น์ฒจ์—์„œ ์ œ์™ธ๋˜์–ด์•ผ ํ•  ์ œ์žฌ ์•„์ด๋”” ๋ชฉ๋ก์€ ๋ช‡๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ง€ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

[์ œํ•œ์‚ฌํ•ญ]

  • user_id ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 1 ์ด์ƒ 8 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • user_id ๋ฐฐ์—ด ๊ฐ ์›์†Œ๋“ค์˜ ๊ฐ’์€ ๊ธธ์ด๊ฐ€ 1 ์ด์ƒ 8 ์ดํ•˜์ธ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
    • ์‘๋ชจํ•œ ์‚ฌ์šฉ์ž ์•„์ด๋””๋“ค์€ ์„œ๋กœ ์ค‘๋ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์‘๋ชจํ•œ ์‚ฌ์šฉ์ž ์•„์ด๋””๋Š” ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž์™€ ์ˆซ์ž๋กœ๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • banned_id ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 1 ์ด์ƒ user_id ๋ฐฐ์—ด์˜ ํฌ๊ธฐ ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • banned_id ๋ฐฐ์—ด ๊ฐ ์›์†Œ๋“ค์˜ ๊ฐ’์€ ๊ธธ์ด๊ฐ€ 1 ์ด์ƒ 8 ์ดํ•˜์ธ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
    • ๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž ์•„์ด๋””๋Š” ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž์™€ ์ˆซ์ž, ๊ฐ€๋ฆฌ๊ธฐ ์œ„ํ•œ ๋ฌธ์ž '*' ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž ์•„์ด๋””๋Š” '*' ๋ฌธ์ž๋ฅผ ํ•˜๋‚˜ ์ด์ƒ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ถˆ๋Ÿ‰ ์‚ฌ์šฉ์ž ์•„์ด๋”” ํ•˜๋‚˜๋Š” ์‘๋ชจ์ž ์•„์ด๋”” ์ค‘ ํ•˜๋‚˜์— ํ•ด๋‹นํ•˜๊ณ  ๊ฐ™์€ ์‘๋ชจ์ž ์•„์ด๋””๊ฐ€ ์ค‘๋ณตํ•ด์„œ ์ œ์žฌ ์•„์ด๋”” ๋ชฉ๋ก์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • ์ œ์žฌ ์•„์ด๋”” ๋ชฉ๋ก๋“ค์„ ๊ตฌํ–ˆ์„ ๋•Œ ์•„์ด๋””๋“ค์ด ๋‚˜์—ด๋œ ์ˆœ์„œ์™€ ๊ด€๊ณ„์—†์ด ์•„์ด๋”” ๋ชฉ๋ก์˜ ๋‚ด์šฉ์ด ๋™์ผํ•˜๋‹ค๋ฉด ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ํ•˜๋‚˜๋กœ ์„ธ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ’€์ด

[์žฌ๊ท€ํ•จ์ˆ˜ ์ด์šฉ]

user_id๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ์ตœ๋Œ€ 8์ด๊ธฐ ๋•Œ๋ฌธ์—, ์‹œ๊ฐ„๋ณต์žก๋„ ๋ฉด์—์„œ ์ถฉ๋ถ„ํ•œ ์—ฌ์œ ๊ฐ€ ์žˆ์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

์žฌ๊ท€ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ banned_id ๋ฐฐ์—ด์— ๋Œ€ํ•œ idx, bitmap(์ง€๊ธˆ๊นŒ์ง€ ๋ฝ‘์€ ์ œ์žฌ ์•„์ด๋”” ๋ชฉ๋ก)์„ ์ฃผ์—ˆ๋‹ค.

 

[์ •๊ทœ์‹]

banned_id๋“ค์„ ์ •๊ทœ์‹ํ˜•ํƒœ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์•ž์— ^, ๋’ค์— $๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , *๋ฅผ .์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค. 

 

[๋น„ํŠธ๋งต]

๋ฝ‘์€ ์ œ์žฌ ์•„์ด๋”” ๋ชฉ๋ก์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๋น„ํŠธ๋งต์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

0, 2๋ฒˆ์งธ ์•„์ด๋””๊ฐ€ ๋ฝ‘ํ˜”์œผ๋ฉด -> 00000101(2)

 

์ฒ˜์Œ์—๋Š”, bool๋ฐฐ์—ด์„ ์ด์šฉํ•ด์„œ ์ œ์žฌ ์•„์ด๋””์•ˆ์— ์ค‘๋ณต์œผ๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋„๋ก ํ™•์ธํ•ด์ฃผ์—ˆ๋‹ค. 

๊ทธ๋Ÿฐ๋ฐ, 

user_id banned_id
["frodo", "fradi", "crodo", "abc123", "frodoc"] ["*rodo", "*rodo", "******"]

์œ„์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—์„œ

frodo, crodo, frodoc

crodo, frodo, frodoc ๊ฐ€ ์ค‘๋ณต์œผ๋กœ ์„ธ์–ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค ใ…œใ…œ

banned_id์— ๊ฐ™์€ ๋ฌธ์ž์—ด์ด ๋‘๊ฐœ๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์ด ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, count๋ฅผ ์„ธ๋Š” ๋ฐฉ์‹์—์„œ, set์— ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ชจ๋‘ ๋„ฃ๊ณ  

๋งˆ์ง€๋ง‰์— set์˜ ํฌ๊ธฐ๋ฅผ returnํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ–ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ bool vector๋ฅผ set์— ๋„ฃ๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” bitmap์ด ํšจ์œจ์ ์ผ ๊ฒƒ ๊ฐ™์•„ bitmap์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค. 

์ฝ”๋“œ

์ „์ฒด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค!

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

using namespace std;

vector<string> user_ids;
vector<string> banned_ids;
unordered_set<int> bitmaps;

void recursive(int idx, int bitmap) {
    regex re(banned_ids[idx]);
    for (int i=0;i<user_ids.size();i++) {
        if (bitmap & (1<<i)) continue;
        if (regex_match(user_ids[i], re)) {
            bitmap += (1<<i);
            if (idx == banned_ids.size()-1) {
                bitmaps.insert(bitmap);
                continue;
            }
            recursive(idx+1, bitmap);
            bitmap -= (1<<i);
        }
    }
}
int solution(vector<string> user_id, vector<string> banned_id) {
    user_ids = user_id; banned_ids = banned_id; // ์ „์—ญ๋ณ€์ˆ˜๋กœ ๋งŒ๋“ค๊ธฐ
    // ์ •๊ทœ์‹ํ˜•ํƒœ๋กœ ๋งŒ๋“ค๊ธฐ (^๋ฌธ์ž์—ด.$)
    for (int i=0;i<banned_ids.size();i++) {
        banned_ids[i].insert(0,"^");
        replace(banned_ids[i].begin(), banned_ids[i].end(), '*', '.');
        banned_ids[i] += "$";
    }
    recursive(0,0);
    int answer = bitmaps.size();
    return answer;
}

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•