[프로그래머스][C++] 신고 결과 받기
신고 결과 받기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)reportInfoList
와reportInfo.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)
댓글남기기