Algorithm/프로그래머스

[프로그래머스] 신고 결과 받기 with C++

nowkoes 2023. 5. 25. 00:00

문제 설명


제한 사항 및 입출력 예제


개념

 id_list에 포함된 사용자가 신고 결과 이메일을 얼마나 많이 받았는지 파악하는 문제다. 각 신고 처리 내역은 "신고자 신고할 사람"의 형식으로 제시된다.

 단, 본 문제에서 핵심적인 고려 사항은 동일한 사용자에 대한 중복 신고가 단 한 번의 신고로만 처리된다는 점이다. 따라서, 동일한 대상에 대한 다수의 신고가 있더라도 이를 단일 신고로 간주하며, 이는 신고 결과 이메일의 수를 결정하는 데 중요한 요소가 된다는 점을 놓치면 안 된다.

 

 따라서 map 자료구조를 활용하여 "신고자" "신고한 사람"의 형태의 쌍을 받아 처리할 수 있다. 각 신고자를 키로 설정하고, 신고한 사람을 값으로 설정한다. 동일한 신고자가 동일한 신고한 사람을 여러 번 신고하더라도, map 구조에서는 한 번만 기록되기 때문에, 신고 결과 이메일을 몇 번 받았는지 쉽게 파악할 수 있다.


풀이

#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;

vector<int> solution(vector<string> id_list, vector<string> report, int k)
{
    vector<int> answer;
    unordered_map<string, vector<string>> m;
    unordered_map<string, int> cnt;

 정답 배열 answer, "신고자" "신고한 사람"의 형태를 저장할 map 자료구조 m을 초기화한다. 그리고 추후에 "신고당한 사람" "신고당한 횟수"의 형태를 저장할 map 자료구조 cnt도 초기화해 준다.

 

    for (int i = 0; i < report.size(); ++i)
    {
        string key, value, tmp;

        for (const auto& val : report[i])
        {
            if (val == ' ')
            {
                key = tmp;
                tmp.clear();
            }

            else
                tmp += val;
        }

        value = tmp;

 신고 내역에는 신고자와 신고한 사람이 공백으로 구분되어 있으므로 공백을 기준으로 key와 value를 지정하였다.

 

        auto found = find(m[key].begin(), m[key].end(), value);

        if (found == m[key].end())
        {
            m[key].push_back(value);
            cnt[value]++;
        }
    }

 만약 맵에 value가 존재한다면, 주어진 조건을 만족하기 위해 값을 추가하지 않게 하였다.

 

    for (const auto& val : id_list)
    {
        int count = 0;

        for (const auto& val2 : m[val])
        {
            if (cnt[val2] >= k)
                count++;
        }

        answer.push_back(count);
    }

    return answer;
}

 id_list에 있는 값을 꺼내서 m과 cnt의 키값으로 써서 주어진 조건을 만족하는지 확인하면 된다.

 

총합본

더보기
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;

vector<int> solution(vector<string> id_list, vector<string> report, int k)
{
    vector<int> answer;
    unordered_map<string, vector<string>> m;
    unordered_map<string, int> cnt;

    for (const auto& val : id_list)
        m[val];

    for (int i = 0; i < report.size(); ++i)
    {
        string key, value, tmp;

        for (const auto& val : report[i])
        {
            if (val == ' ')
            {
                key = tmp;
                tmp.clear();
            }

            else
                tmp += val;
        }

        value = tmp;

        auto found = find(m[key].begin(), m[key].end(), value);

        if (found == m[key].end())
        {
            m[key].push_back(value);
            cnt[value]++;
        }
    }

    for (const auto& val : id_list)
    {
        int count = 0;

        for (const auto& val2 : m[val])
        {
            if (cnt[val2] >= k)
                count++;
        }

        answer.push_back(count);
    }

    return answer;
}

 

반응형