https://school.programmers.co.kr/learn/courses/30/lessons/92334
문제 설명
신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
• 각 유저는 한번에 한 한명의 유저를 신고할 수 있음.
• 신고 횟수제한은 없음.
• 동일한 유저에 대한 신고 횟수는 1회로 처리.
• k번 이상 신고된 유저는 게시판 이용 정지, 해당 유저를 신고한 유저들에게 정지 메일 발송.
• 유저가 신고한 모든 내용을 마지막에 한꺼번에 게시판 이용 정지 후 정지 메일 발송.
예제
다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다.
유저 ID | 유저가 신고한 ID | 설명 |
"muzi" | "frodo" | "muzi"가 "frodo"를 신고했습니다. |
"apeach" | "frodo" | "apeach"가 "frodo"를 신고했습니다. |
"frodo" | "neo" | "frodo"가 "neo"를 신고했습니다. |
"muzi" | "neo" | "muzi"가 "neo"를 신고했습니다. |
"apeach" | "muzi" | "apeach"가 "muzi"를 신고했습니다. |
각 유저별로 신고당한 횟수는 다음과 같습다.
유저 ID | 신고당한 횟수 |
"muzi" | 1 |
"frodo" | 2 |
"apeach" | 0 |
"neo" | 2 |
위 예시에서는 2번 이상 신고당한 "frodo"와 "neo"의 게시판 이용이 정지됩니다. 이때, 각 유저별로 신고한 아이디와 정지된 아이디를 정리하면 다음과 같습니다.
유저 ID | 유저가 신고한 ID | 정지된 ID |
"muzi" | ["frodo", "neo"] | ["frodo", "neo"] |
"frodo" | ["neo"] | ["neo"] |
"apeach" | ["muzi", "frodo"] | ["frodo"] |
"neo" | 없음 | 없음 |
따라서 "muzi"는 처리 결과 메일을 2회, "frodo"와 "apeach"는 각각 처리 결과 메일을 1회 받게 됩니다.
이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.
내 풀이
unordered_map<string, set<string>> report_listl; //Key:신고당한 사람 Value:신고한 사람들
unordered_map<string, int> mail_count;
vector<int> answer;
일단 신고한 사람들이 누군지를 담고 있는 report_list와 그리고 유저가 받아야 할 이메일의 수를 저장하는 mail_count를 선언하였다.
for (int i = 0; i < report.size(); i++)
{
string reporter = report[i].substr(0, report[i].find(" "));
string reported = report[i].substr(report[i].find(" ") + 1);
report_listl[reported].insert(reporter);
}
그리고 신고한 기록들을 담고 있는 report에 있는 값들을 신고자와 신고 당한 사람을 구분하여 report_list에다가 신고 당한 사람을 Key로 하고 그 유저를 신고한 대상을 Value에 추가해준다. report_list의 Value는 Set으로 되어있어 여러 개의 값을 중복 없이 입력할 수 있다.
for(auto report : report_listl)
{
if (report.second.size() < k)
continue;
for(auto k : report.second)
mail_count[k]++;
}
report_list에 있는 Value(신고한 사람)의 수가 k(정지 기준 횟수)이상이면 신고한 사람들에게 메일을 전달한다.
for (int i = 0; i < id_list.size(); i++)
answer.push_back(mail_count[id_list[i]]);
return answer;
이제 유저 아이디 입력순으로 정답 answer에다가 입력한다.
전체 코드
#include <vector>
#include <string>
#include <unordered_map>
#include <set>
using namespace std;
vector<int> solution(vector<string> id_list, vector<string> report, int k)
{
unordered_map<string, set<string>> report_listl; //Key:신고당한 사람 Value:신고한 사람들
unordered_map<string, int> mail_count;
vector<int> answer;
for (int i = 0; i < report.size(); i++)
{
string reporter = report[i].substr(0, report[i].find(" "));
string reported = report[i].substr(report[i].find(" ") + 1);
report_listl[reported].insert(reporter);
}
for(auto report : report_listl)
{
if (report.second.size() < k)
continue;
for(auto k : report.second)
mail_count[k]++;
}
for (int i = 0; i < id_list.size(); i++)
answer.push_back(mail_count[id_list[i]]);
return answer;
}
결론
해시를 이용하여 풀수있는 간단한 문제이다.
'프로그래밍 > C++' 카테고리의 다른 글
[C++]그리디 알고리즘(Greedy Algorithm) (0) | 2023.12.18 |
---|---|
[프로그래머스/C++] 네트워크 (0) | 2023.12.04 |
[알고리즘/C++] 이진 탐색 트리 (Binary Search Tree, BST) (2) | 2023.11.08 |
[Algorithm] DFS와 BFS (2) | 2023.10.11 |
[알고리즘/C++]버블정렬Bubble Sort (1) | 2023.06.07 |