신고 결과 받기Permalink

문제 링크Permalink

신고 결과 받기

분석Permalink

신고한 사람과 신고당한 사람으로 구분됩니다.

한 사람이 여러 사람을 신고 할 수 있으며, 한 사람이 한 사람을 중복으로 신고할 수 있습니다.
중복 신고는 1회로 처리해야합니다.

k번 이상 신고를 받은 유저는 정지됩니다.

정지될 유저를 신고한 유저에게 메일을 보내야하고, 유저별로 해당 메일을 받는 개수를 반환해야합니다.

풀이Permalink

#include <string>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <sstream>

using namespace std;

vector<int> solution(vector<string> id_list, vector<string> report, int k) {
    vector<int> answer;
    // 신고당한 사람을 키로 신고한 사람들을 저장
    // 중복 신고를 방지하기 위한 unordered_set 사용
    unordered_map<string, unordered_set<string>> reportInfoList;
    
    // report 순회
    for (int i = 0; i < report.size(); ++i)
    {
        // 신고 한 사람과 신고 당한 사람을 문자열에서 분리
        istringstream iss(report[i]);
        
        std::string reportSender;
        std::string reportTarget;
        
        iss >> reportSender >> reportTarget;
        
        // 신고 당한 사람을 키로, 신고한 사람들을 값으로 저장
        reportInfoList[reportTarget].insert(reportSender);
    }
    
    // 메일을 받아야하는 개수를 저장
    unordered_map<string, int> reportCounts;
    
    // reportInfoList 순회
    for (auto reportInfo : reportInfoList)
    {
        // 신고 당한 사람이 정지를 당해야하는 경우
        if (k <= reportInfo.second.size())
        {
            // 신고 한 사람이 받아야할 메일의 개수를 증가시킨다.
            for (auto reportSender : reportInfo.second)
            {
                ++reportCounts[reportSender];
            }
        }
    }
    
    // 각 유저가 받아야할 메일의 개수를 저장
    for (auto id : id_list)
    {
        answer.push_back(reportCounts[id]);
    }
    
    return answer;
}

성능 요약Permalink

시간 복잡도는 O(n2)입니다.

  • report를 순회하는 반복문 O(n)
  • reportInfoListreportInfo.second를 순회하는 중첩 반복문 O(m×s)
  • id_list를 순회하는 반복문 O(l)
  • O(n+m×s+l)

공간 복잡도는 O(n2)입니다.

  • N개의 키와 N개의 값을 가지는 unordered_map<string, set<string>> reportInfoList O(n×n)
  • 사용자마다 하나의 정수 값을 가지는 unordered_map<string, int> reportCounts O(n)
  • 반환 값을 저장하는 vector<int> answer O(n)

테스트 1 〉 통과 (0.03ms, 3.68MB)
테스트 2 〉 통과 (0.04ms, 3.69MB)
테스트 3 〉 통과 (200.54ms, 40.1MB)
테스트 4 〉 통과 (0.06ms, 4.22MB)
테스트 5 〉 통과 (0.06ms, 3.69MB)
테스트 6 〉 통과 (1.39ms, 4.17MB)
테스트 7 〉 통과 (3.14ms, 4.14MB)
테스트 8 〉 통과 (5.94ms, 4.6MB)
테스트 9 〉 통과 (87.07ms, 20.8MB)
테스트 10 〉 통과 (86.76ms, 20.6MB)
테스트 11 〉 통과 (197.65ms, 39.9MB)
테스트 12 〉 통과 (0.28ms, 4.21MB)
테스트 13 〉 통과 (0.30ms, 4.16MB)
테스트 14 〉 통과 (102.06ms, 19.8MB)
테스트 15 〉 통과 (160.09ms, 32.9MB)
테스트 16 〉 통과 (0.21ms, 4.15MB)
테스트 17 〉 통과 (0.27ms, 4.16MB)
테스트 18 〉 통과 (0.48ms, 4.21MB)
테스트 19 〉 통과 (0.80ms, 4.21MB)
테스트 20 〉 통과 (79.93ms, 19.8MB)
테스트 21 〉 통과 (169.78ms, 32.6MB)
테스트 22 〉 통과 (0.02ms, 4.15MB)
테스트 23 〉 통과 (0.02ms, 3.68MB)
테스트 24 〉 통과 (0.02ms, 4.21MB)

Programmers 카테고리 내 다른 글 보러가기

댓글남기기