[c++/프로그래머스] 신고 결과 받기

조히·2022년 5월 28일
0

PS

목록 보기
10/82

문제링크

신고 결과 받기

풀이

  1. 메일을 못받는 사람도 있을 수 있기 때문에 0으로 초기화 해준다.
    mail의 구조는 key에 신고자가 들어가고 value에 신고한 사람의 수가 들어간다.
    원래는 unordered_map으로 해주려고 했는데 왜인지 순서가 이상하게 출력돼서 그냥 map으로 구현했다.
  2. report_listkey는 신고 받은 사람, value는 신고 한 사람의 리스트가 들어간다. 신고자의 리스트를 set으로 한 이유는 중복 처리를 막으려고
    2-1. 띄어쓰기로 신고자와 신고 받은 사람이 나뉘기 때문에 띄어쓰기를 기준으로 bool 체크를 해서 a는 신고자, b는 신고 받은 사람이 된다.
  3. report_list를 돌리면서 iter->secondsizek이상인 사람은 정지가 되기 때문에 mail[u]++를 해준다.
  4. unordered_map이 제대로 안돌아가서 id_list를 돌리면서 answer에 정지 먹인 사람의 수를 추가해주었다.

코드

#include <string>
#include <vector>
#include <map>
#include <set>

using namespace std;

vector<int> solution(vector<string> id_list, vector<string> report, int k) {
    vector<int> answer;
    map<string,set<string>> report_list;
    map<string, int> mail;
    
    for(int i=0;i<id_list.size();i++)
    {
        mail.insert(make_pair(id_list[i], 0));
    }
    
    for(int i=0;i<report.size();i++)
    {
        string a="";
        string b="";
        bool chk=false;
        for(int j=0;j<report[i].size();j++)
        {
            if(report[i][j]!=' '&&chk==false) a+=report[i][j];
            else if(report[i][j]==' ') chk=true;
            else b+=report[i][j];
        }
        report_list[b].insert(a);
    }
    
    auto iter = report_list.begin();
    while(iter!=report_list.end())
    {
        if(iter->second.size()>=k)
        {
            for(auto u:iter->second)
            {
                mail[u]++;
            }
        }
        iter++;
    }
    
    for(int i=0;i<id_list.size();i++)
    {
        answer.push_back(mail[id_list[i]]);
    }
    return answer;
}

P.S.

오랜만에 푸는 알고리즘.. 1단계인데 30분이나 걸리다니 다시 공부 열심히 해야지..

profile
Juhee Kim | Game Client Developer

0개의 댓글