𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] λΆˆλŸ‰ μ‚¬μš©μž - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] λΆˆλŸ‰ μ‚¬μš©μž - C++

.23 2024. 11. 12. 19:36
문제

πŸ”—: ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - λΆˆλŸ‰ μ‚¬μš©μž

 

κ°œλ°œνŒ€ λ‚΄μ—μ„œ 이벀트 κ°œλ°œμ„ λ‹΄λ‹Ήν•˜κ³  μžˆλŠ” "무지"λŠ” 졜근 μ§„ν–‰λœ 카카였이λͺ¨ν‹°μ½˜ μ΄λ²€νŠΈμ— 비정상적인 λ°©λ²•μœΌλ‘œ 당첨을 μ‹œλ„ν•œ 응λͺ¨μžλ“€μ„ λ°œκ²¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이런 응λͺ¨μžλ“€μ„ λ”°λ‘œ λͺ¨μ•„   λΆˆλŸ‰ μ‚¬μš©μž λΌλŠ” μ΄λ¦„μœΌλ‘œ λͺ©λ‘μ„ λ§Œλ“€μ–΄μ„œ 당첨 처리 μ‹œ μ œμ™Έν•˜λ„λ‘ 이벀트 λ‹Ήμ²¨μž λ‹΄λ‹ΉμžμΈ "ν”„λ‘œλ„" μ—κ²Œ μ „λ‹¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€. 이 λ•Œ κ°œμΈμ •λ³΄ λ³΄ν˜Έμ„ μœ„ν•΄ μ‚¬μš©μž 아이디 쀑 일뢀 문자λ₯Ό '*' 문자둜 κ°€λ €μ„œ μ „λ‹¬ν–ˆμŠ΅λ‹ˆλ‹€. κ°€λ¦¬κ³ μž ν•˜λŠ” 문자 ν•˜λ‚˜μ— '*' 문자 ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•˜μ˜€κ³  아이디 λ‹Ή μ΅œμ†Œ ν•˜λ‚˜ μ΄μƒμ˜ '*' 문자λ₯Ό μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
"무지"와 "ν”„λ‘œλ„"λŠ” λΆˆλŸ‰ μ‚¬μš©μž λͺ©λ‘μ— λ§€ν•‘λœ 응λͺ¨μž 아이디λ₯Ό  μ œμž¬ 아이디   λΌκ³  λΆ€λ₯΄κΈ°λ‘œ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, μ΄λ²€νŠΈμ— 응λͺ¨ν•œ 전체 μ‚¬μš©μž 아이디 λͺ©λ‘μ΄ λ‹€μŒκ³Ό κ°™λ‹€λ©΄

  응λͺ¨μž 아이디
  frodo
  fradi
  crodo
  abc123
  frodoc

 

λ‹€μŒκ³Ό 같이 λΆˆλŸ‰ μ‚¬μš©μž 아이디 λͺ©λ‘μ΄ μ „λ‹¬λœ 경우,

  λΆˆλŸ‰ μ‚¬μš©μž
  fr*d*
  abc1**

 

λΆˆλŸ‰ μ‚¬μš©μžμ— λ§€ν•‘λ˜μ–΄ λ‹Ήμ²¨μ—μ„œ μ œμ™Έλ˜μ–΄μ•Ό ν•  제재 아이디 λͺ©λ‘μ€ λ‹€μŒκ³Ό 같이 두 가지 κ²½μš°κ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

  제재 아이디
  frodo
  abc123

 

  제재 아이디
  fradi
  abc123

이벀트 응λͺ¨μž 아이디 λͺ©λ‘μ΄ λ‹΄κΈ΄ λ°°μ—΄ 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 banned_id result
["frodo", "fradi", "crodo", "abc123", "frodoc"] ["fr*d*", "abc1**"] 2
["frodo", "fradi", "crodo", "abc123", "frodoc"] ["fr*d*", "*rodo", "******"] 2
["frodo", "fradi", "crodo", "abc123", "frodoc"] ["fr*d*",  "*rodo", "******", "******"] 3

탐색 문제.

μ°Έκ³ : https://codingjj.tistory.com/84

 

DFS ν™œμš©ν•œ 탐색 λ¬Έμ œλŠ” μ–Έμ œ 풀어도 μ–΄λ ΅κ³  μž¬λ°‹λ‹Ή

 

κΈ°λ³Έ μ›λ¦¬λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

1.  banned_id  λ‘œλΆ€ν„° λΆˆλŸ‰ μ‚¬μš©μžμ— 맀핑할 수 μžˆλŠ” μ‚¬μš©μžλ“€μ˜ κ·Έλž˜ν”„λ₯Ό 생성해쀀닀.

2.  banned_id  λ‘œλΆ€ν„° μƒμ„±λœ κ·Έλž˜ν”„λ‘œλΆ€ν„° 탐색을 μ§„ν–‰ν•˜λ©° 이전에 탐색을 ν•œ 적 μ—†λŠ” 아이디인 경우 DFS 진행

    단, 응λͺ¨ν•œ μ‚¬μš©μžλ“€μ€ μ„œλ‘œ μ€‘λ³΅λ˜μ§€ μ•Šμ•„μ•Ό ν•˜λ―€λ‘œ

    banned_idλ‘œλΆ€ν„° 탐색을 μ§„ν–‰ν•œ μ•„μ΄λ””λŠ” set에 집어넣어 관리λ₯Ό ν•΄μ€€λ‹€.

 

C++ set containerλŠ” python의 set처럼 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•Šμ€ keyλ“€μ˜ μ˜€λ¦„μ°¨μˆœ 집합이닀.

μ°Έκ³ : https://blockdmask.tistory.com/79

 

λ”°λΌμ„œ set을 ν™œμš©ν•œ 탐색 μ•„μ΄λ””μ–΄λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

첫번째 banned_idλ‘œλΆ€ν„° DFS 탐색을 진행해가며

- ν˜„μž¬ 탐색쀑인 제재 아이디 λͺ©λ‘μ„ λ‹΄κ³ μžˆλŠ” temp set에 ν•΄λ‹Ή idκ°€ μ—†λŠ” 경우, μ§€κΈˆκΉŒμ§€μ˜ set에 idλ₯Ό μΆ”κ°€

- λ§ˆμ§€λ§‰ banned_id μΈλ±μŠ€κΉŒμ§€ λ„λ‹¬ν–ˆμ„ λ•Œ, μ§€κΈˆκΉŒμ§€ νƒμƒ‰ν•œ 제재 아이디 λͺ©λ‘μ„ μΆ”κ°€

if(idx == graph.size()) {
    answer.insert(temp);
}

else{
    for(int i = 0; i < graph[idx].size(); i++) {
        if(temp.find(graph[idx][i]) == temp.end()) {
            set<string> new_set(temp);
            new_set.insert(graph[idx][i]);
            DFS(idx + 1, new_set);
        }
    }
}

 

λ§ˆμ§€λ§‰μ— answerμ—λŠ” 전체 경우의 μˆ˜κ°€ λ‹΄κΈ΄ 배열이 μ­‰ λ‹΄κ²¨μžˆκΈ° λ•Œλ¬Έμ—,

전체 answer의 길이λ₯Ό returnν•΄μ£Όλ©΄ 정닡이 λœλ‹€.

 

 

μ½”λ“œ
#include <string>
#include <vector>
#include <set>

using namespace std;

set<set<string>> answer;
vector<vector<string>> graph;

bool Compare(string banned, string user) {
    int length = banned.length();
    bool is_same = true;

    // 길이 λ‹€λ₯΄λ©΄ μ»·    
    if(user.length() != length) return false;

    for(int i = 0; i < length; i++) {
        if(banned[i] == '*') continue;
        if(banned[i] != user[i]) is_same = false;
    }

    return is_same;
}

void DFS(int idx, set<string> temp) {
    if(idx == graph.size()) {
        answer.insert(temp);
    }

    else{
        for(int i = 0; i < graph[idx].size(); i++) {
            if(temp.find(graph[idx][i]) == temp.end()) {
                set<string> new_set(temp);
                new_set.insert(graph[idx][i]);
                DFS(idx + 1, new_set);
            }
        }
    }
}

int solution(vector<string> user_id, vector<string> banned_id) {
    int banned = banned_id.size();
    int user = user_id.size();
    graph.resize(banned, vector<string>());

    for(int i = 0; i < banned; i++)
        for(int j = 0; j < user; j++)
            if(Compare(banned_id[i], user_id[j])) graph[i].push_back(user_id[j]);

    
    set<string> temp;
    DFS(0, temp);
    
    return answer.size();
}

 

Comments