๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/3๋‹จ๊ณ„

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

by Jaeguk 2022. 7. 7.
๋ฌธ์ œ ๋งํฌ

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

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

์œ ์ € ์•„์ด๋”” ๋ชฉ๋ก๊ณผ ์ผ๋ถ€๊ฐ€ ์ง€์›Œ์ง„ ์ œ์žฌ ์•„์ด๋”” ๋ชฉ๋ก์ด ์ฃผ์–ด์กŒ์„ ๋•Œ,

๊ฐ€๋Šฅํ•œ ์ œ์žฌ ์•„์ด๋”” ๋ชฉ๋ก์˜ ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋ฌธ์ œ.

 

ํ’€์ด

์ œ์žฌ ์•„์ด๋””์˜ ์ผ๋ถ€๊ฐ€ ๊ฐ€๋ ค์ ธ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด ์งˆ ์ˆ˜์žˆ๋‹ค.

๋งŒ์•ฝ ์ฃผ์–ด์ง„ ์ œ์žฌ ์•„์ด๋””๊ฐ€ "Fr*d*" ๋ผ๋ฉด "Frodo"๋กœ ๊ฐ€๋Šฅํ•˜๊ณ  "Frida"  ๋“ฑ๋“ฑ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ชจ๋“  ์•„์ด๋””๋ฅผ ์ œ์žฌ ๊ฐ€๋Šฅํ•˜๋‹ค.

์‹ฌ์ง€์–ด "******" ์ฒ˜๋Ÿผ ๋ชจ๋‘ ๊ฐ€๋ ค์ง„ ์ œ์žฌ ์•„์ด๋””๋ผ๋ฉด ๊ธ€์ž์ˆ˜๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ์•„์ด๋””๋ฅผ ์ œ์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ์ œ์žฌ๊ฐ€ ์ผ๋Œ€์ผ ๋Œ€์‘์œผ๋กœ ์ด๋ค„์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์„ธ๊ธฐ๊ฐ€ ์–ด๋ ค์› ๋‹ค.

 

๊ทธ๋ž˜์„œ ์ผ๋‹จ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ํ•ด๋ณด์•„์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๋จผ์ €, ์ž„์˜์˜ ์ œ์žฌ ์•„์ด๋”” i๊ฐ€ ์ œ์žฌํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ € ์•„์ด๋””์˜ ๋ชฉ๋ก์„ ๋”ฐ๋กœ ์ƒ์„ฑํ•œ๋‹ค.

์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด์„œ ์„ค๋ช…ํ•˜์ž๋ฉด

์œ ์ € ์•„์ด๋”” ๋ชฉ๋ก์ด ["frodo", "fradi", "crodo", "abc123", "frodoc"]

์ œ์žฌ ์•„์ด๋”” ๋ชฉ๋ก์ด ["fr*d*", "abc1**"] ๋ผ๋ฉด

0๋ฒˆ์งธ ์ œ์žฌ ์•„์ด๋”” "fr*d"๊ฐ€ ์ œ์žฌ ๊ฐ€๋Šฅํ•œ ์œ ์ € ์•„์ด๋””๋Š” 0๋ฒˆ์งธ "frodo"์™€ 1๋ฒˆ์งธ "fradi" ๋‘ ๊ฐ€์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

1๋ฒˆ์งธ ์ œ์žฌ ์•„์ด๋”” "abc1**" ์€ 3๋ฒˆ์งธ ์œ ์ € ์•„์ด๋””์ธ" abc123"๋ฅผ ์ œ์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด  can_ban[0] = {0, 1}, can_ban[1] = {3} ์ด๋ ‡๊ฒŒ ๋œ๋‹ค.

๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“  ์ œ์žฌ ์•„์ด๋””์— ๋Œ€ํ•ด ์ œ์žฌ ๊ฐ€๋Šฅํ•œ ์œ ์ €๋“ค์˜ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ•ด์„œ ๋ชจ๋“  ์ œ์žฌ ์•„์ด๋””์— ๋Œ€ํ•ด ์ œ์žฌํ•  ์•„์ด๋””๋ฅผ ํ•˜๋‚˜์”ฉ ๋Œ€์‘์‹œํ‚ค๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ด๋ฏธ ์ œ์žฌ๋œ ์•„์ด๋””๋Š” ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ œ์žฌ ์•„์ด๋””๊ฐ€ ํ•˜๋‚˜์˜ ์œ ์ €์•„์ด๋””๋ฅผ ์ œ์žฌํ•˜์ง€ ์•Š๋„๋ก ํ–ˆ๋‹ค.(์ผ๋Œ€์ผ ๋Œ€์‘)

๋ชจ๋“  ์ œ์žฌ ์•„์ด๋””์— ๋Œ€ํ•ด ํ•˜๋‚˜์”ฉ ์œ ์ €์•„์ด๋””๋ฅผ ํ•˜๋‚˜์”ฉ ๋Œ€์‘์‹œ์ผฐ๋‹ค๋ฉด ๋ชฉ๋ก ํ•˜๋‚˜๊ฐ€ ์™„์„ฑ๋œ ๊ฒƒ์ด๋‹ค.

๊ตฌํ˜„์€ ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ด์šฉํ•ด์„œ ๊นŠ์ด๊ฐ€ ๋ชจ๋“  ์ œ์žฌ ์•„์ด๋””์˜ ์ˆ˜์™€ ๊ฐ™์•„์กŒ์„ ๊ฒฝ์šฐ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋”ํ•˜๊ณ  ๋ฆฌํ„ด์‹œ์ผฐ๋‹ค.

 

์—ฌ๊ธฐ์„œ ํ•œ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋งŒ์•ฝ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ œ์žฌ ์•„์ด๋””๊ฐ€ ์ค‘๋ณต์ ์œผ๋กœ ๊ฐ™์€ ์•„์ด๋””๋ฅผ ์ œ์žฌํ•  ์ˆ˜ ์žˆ์„ ๋•Œ, ์ค‘๋ณต์ด ๋ฐœ์ƒํ•œ๋‹ค.

"*****" ๋ผ๋Š” ์ œ์žฌ ์•„์ด๋””์™€ "fr*d*" ๋ผ๋Š” ์ œ์žฌ ์•„์ด๋””๋Š” ๊ณตํ†ต์ ์œผ๋กœ "frodo", "frida" ๋ผ๋Š” ์•„์ด๋””๋ฅผ ์ œ์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.

1. "*****" -> "frodo" , "fr*d*" -> "frida"

2. "*****" -> "frida" , "fr*d*" -> "frodo"

๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋Š” ๋‹ค๋ฅธ ๊ฒฝ์šฐ์ง€๋งŒ ๊ฒฐ๊ณผ๋งŒ ๋†“๊ณ  ๋ณธ๋‹ค๋ฉด ์ œ์žฌ๋œ ์•„์ด๋”” ๋ชฉ๋ก์€ ๊ฐ™๊ฒŒ ํ˜•์„ฑ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์œ„์™€๊ฐ™์€ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•ด์•ผํ–ˆ๋‹ค.

ํŒฉํ† ๋ฆฌ์–ผ์„ ์ด์šฉํ•ด์„œ ์กฐํ•ฉ์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋ฉด ๋ ๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ์ง€๋งŒ ์•„๋‹ˆ์—ˆ๋‹ค.

 

๊ฒฐ๊ตญ set์„ ์ด์šฉํ•ด์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ–ˆ๋‹ค.

์ œ๊ฑฐ๋œ ์•„์ด๋”” ์ธ๋ฑ์Šค๋“ค์„ ์ •๋ ฌํ•œ ํ›„ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊ฟ” set์— ์ง‘์–ด๋„ฃ์—ˆ๋‹ค.

๋งŒ์•ฝ 0, 1, 3๋ฒˆ ์•„์ด๋””๊ฐ€ ์ œ์žฌ๋˜์—ˆ๋‹ค๊ณ  ํ•˜๋ฉด ํ•ด๋‹น ๋ฒˆํ˜ธ๋“ค์„ ๋ฌธ์ž์—ด๋กœ ์ด์–ด๋ถ™์—ฌ "013"ํ˜•ํƒœ๋กœ set์— ๋„ฃ๋Š”๋‹ค

set์€ ์ค‘๋ณต์„ ์•Œ์•„์„œ ์ œ๊ฑฐํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ข…์ ์œผ๋กœ set์˜ ํฌ๊ธฐ๊ฐ€ ์ •๋‹ต์ด ๋œ๋‹ค.

 

์ฝ”๋“œ ์ž‘์„ฑ
 
#include <string>
#include <vector>
#include <iostream>
#include <set>
#include <algorithm>
#include <string.h>
using namespace std;
const int MAX_N = 10;
bool visited[MAX_N];
set<string> cases;
void backtracking(int depth, vector<int> can_ban[], int n, int& answer, vector<int> list){
    if(depth == n){
        sort(list.begin(),list.end());
        string tmp = "";
        for(auto l : list)
            tmp += to_string(l);
        cases.insert(tmp);
        return;
    }
    for(int i = 0; i < can_ban[depth].size(); i++){
        if(visited[can_ban[depth][i]])
            continue;
        visited[can_ban[depth][i]] = true;
        list.push_back(can_ban[depth][i]);
        backtracking(depth + 1, can_ban, n ,answer, list);
        list.pop_back();
        visited[can_ban[depth][i]] = false;
    }
}
 
int solution(vector<string> user_id, vector<string> banned_id) {
    int answer = 0;
    vector<int> can_ban[9]; //i๋ฒˆ์งธ banned_id๊ฐ€ ban ๊ฐ€๋Šฅํ•œ ์œ ์ € ์•„์ด๋”” ๋ชฉ๋ก
    vector<int> temp;
    for(int i = 0; i<banned_id.size(); i++){
        for(int j = 0; j<user_id.size();j++){
            if(banned_id[i].length() != user_id[j].length())
                continue;
            bool chk = true;
            for(int com = 0; com < banned_id[i].length(); com++){
                if(banned_id[i][com] == '*')
                    continue;
                if(banned_id[i][com] != user_id[j][com]){
                    chk = false;
                    break;
                }
            }
            if(chk)
                can_ban[i].push_back(j);
        }
    }
    backtracking(0, can_ban, banned_id.size(), answer, temp);
    answer = cases.size();
    return answer;
}
cs

 

728x90