[프로그래머스/C++]Lv.1 - 신고 결과 받기

YH J·2023년 5월 17일
0

프로그래머스

목록 보기
86/168

문제 링크

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

내 풀이

순서를 잘 생각해서 해결하자.
1. report를 파싱하여 map에 넣는데 map의 첫번째 원소는 신고 당한사람, 두번째 set 컨테이너에는 해당 유저를 신고한 사람을 넣어준다. set 컨테이너이므로 중복은 제거된다.
2. 파싱된 결과를 기반으로 k횟수보다 많이 신고된 유저의 set컨테이너를 기반으로 메일받을 유저와 횟수를 map에 넣어준다.
3. 결과를 기반으로 answer에 id_list의 순서에 맞게 횟수를 넣어준다.

내 코드

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

using namespace std;

vector<int> solution(vector<string> id_list, vector<string> report, int k) {
    vector<int> answer(id_list.size(),0);
    
    //map의 첫번째 원소에는 신고 당한사람, 두번째 set 컨테이너에는 해당 사람을 신고한 사람(set이라 중복없음)
    map<string,set<string>> rp;
    for(const auto& r : report)
    {
        stringstream s(r);
        string a;
        string b;
        s >> a;
        s >> b;
        rp[b].insert(a);
    }
    //신고 한 횟수 체크해서 메일받을 사람과 횟수 담기
    map<string,int> result;
    for(const auto& r : rp)
    {
        if(r.second.size() >= k)
        {
            for(const auto& s : r.second)
            {
                result[s]++;
            }
        }
    }
    //메일 보낼 횟수 넣기
    for(int i = 0; i < id_list.size(); i++)
    {
        answer[i] = result[id_list[i]];
    }
    
    return answer;
}

다른 사람의 풀이

#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;

vector<int> solution(vector<string> id_list, vector<string> report, int k) {
    // 1.
    const int n = id_list.size();
    map<string, int> Conv;
    for (int i = 0; i < n; i++) Conv[id_list[i]] = i;

    // 2.
    vector<pair<int, int>> v;
    sort(report.begin(), report.end());
    report.erase(unique(report.begin(), report.end()), report.end());
    for (const auto& s : report) {
        stringstream in(s);
        string a, b; in >> a >> b;
        v.push_back({ Conv[a], Conv[b] });
    }

    // 3.
    vector<int> cnt(n), ret(n);
    for (const auto& [a, b] : v) cnt[b]++;
    for (const auto& [a, b] : v) if (cnt[b] >= k) ret[a]++;
    return ret;
}

다른 사람의 풀이 해석

  1. id_list의 아이디와 그 순서에 맞게 인덱스를 map<string,int>에 넣어준다.
  2. report를 파싱하는데 erase(unique)를 이용하여 중복을 먼저 제거해 주는데, sort를 하는 이유는 erase(unique)를 할 때 a, a, b, a 를 한다 치면 a, b, a가 된다. 즉 연속으로 중복되는것만 제거해준다고 한다.
    하여튼 sort를 한 뒤 중복을 제거하고 stringstream으로 파싱하여 vector<pair<int,int>>에 넣어주는데 id_list에서 신고한 아이디와 받은 아이디의 인덱스를 넣어주는 것이다.
  3. 완성된 v를 기반으로 for문을 돌리면서 cnt에 해당 인덱스가 신고당한 횟수를 기록한다. 완성된 cnt를 기반으로 신고당한 횟수가 k이상인 유저를 신고한 유저에게 메일을 보낼 횟수를 ++한다(ret)
profile
게임 개발자 지망생

0개의 댓글