[プログラマー]通報結果を得る(C++,KACA)


https://programmers.co.kr/learn/courses/30/lessons/92334
ここ数日面接や人柄、メモなどいろいろな試験が重なってブログに発表できませんでした.
もっと頑張ろう!
この問題はmap,set資料構造で解いた.
私がmapを書いた理由はkey-value形式で、申告回数を保存するのに適していると思ったので使いました.
setは繰り返しを処理するために使用されます.
問題を解決する方法は次のとおりです.
宣言は
  • mapであり、申告者と申告者を同時に保存することができる.
  • に報告し、申告者と被申告者を保存します.
  • 完全idリストに保存されている申告者がkより大きい場合は、個別の配列に設定することによって申告者を検査することができる.
  • #include <string>
    #include <vector>
    #include <map>
    #include <iostream>
    #include <set>
    #include <algorithm>
    
    using namespace std;
    
    vector<int> solution(vector<string> id_list, vector<string> report, int k) {
        vector<int> answer;
        // map으로 신고받은 자와 신고자를 연결해준다.
        map<string, set<string>> alert;
        // 나중에 신고자를 계산할 때 쓰는 별도의 배열 
        int mail[1001];
        for (int i = 0; i < 1001; i++) mail[i] = 0;
        for (int i = 0; i < report.size(); i++) {
            // 공백 기준으로 잘라서
            int index = report[i].find(" ");
            // 신고자에 신고 받은자를 set에 담아준다.
            alert[report[i].substr(index + 1)].insert(report[i].substr(0, index));
        }
        // 전체 list를 돌면서
        for (int i = 0; i < id_list.size(); i++) {
            // 신고자가 k 이상이면
            if (alert[id_list[i]].size() >= k) {
                // set을 돌면서 별도의 배열에 신고자를 체크해준다.
                for (auto it = alert[id_list[i]].begin(); it != alert[id_list[i]].end(); it++) {
                    int index = find(id_list.begin(), id_list.end(), *it) - id_list.begin();
                    mail[index]++;
                }
            }
        }
        for (int i = 0; i < id_list.size(); i++) {
            answer.push_back(mail[i]);
        }
        return answer;
    }