개발일지

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 문제 설명

 

신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.

• 각 유저는 한번에 한 한명의 유저를 신고할 수 있음.

         • 신고 횟수제한은 없음.

         • 동일한 유저에 대한 신고 횟수는 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;
}

 

 결론

해시를 이용하여 풀수있는 간단한 문제이다.

profile

개발일지

@damin06

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!