* 한 사람이 여러 사람을 신고할 수 있음

* 한 사람이 동일한 사람을 여러번 신고할 경우 한 번 신고된 것으로 간주

* k 번 이상 신고된 사람은 정지. 해당 이용자를 신고한 사람들에게 메일 발송

 

 

1. 피신고자의 신고 정보를 저장

정렬은 필요 없기 때문에 unordered_map 사용 (report_count)

key 에는 피신고자 이름을 string 형태로, value에는 해당 신고자를 set<string>형태로 저장

!! 동일한 사람이 다른 이용자 한 명을 여러번 신고했을 경우 한 번 신고한 것으로 간주해야 하기 때문에 중복을 방지하는 set이 적합하다고 판단 !!

 

 

2. 신고자들의 인덱스 정보를 저장

k번 이상 신고당해 정지된 이용자들을 신고했던 신고자들의 배열 인덱스 정보 관리

역시 정렬 필요없기 때문에 unordered_map 사용 (id_index)

key에는 신고자 이름, value에는 id_list에서의 순서를 저장

 

 

3. vector<string> report 의 요소를 공백 기준으로 분류하여 신고자와 피신고자 구분

공백이 포함된 문자열을 공백 기준으로 나눠 저장하기 위해 Stringstream 사용

for 문을 활용하여 report의 요소들을 각각 분해하여 report_count에 key와 value로 저장

 

 

4. report_count탐색

value의 값이 k이상인 사람(it.second.size() >=k) 을 발견하면 value인 set을 탐색

set에 들어있는 신고자의 이름을 id_index 에서 탐색하여 id_list에서의 인덱스 정보 추출

answer의 인덱스에 해당하는 요소의 정수값을 1 증가 >> 메일 발송 횟수 1 증가

 

 

vector<int> solution(vector<string> id_list, vector<string> report, int k) {
	vector<int> answer(id_list.size(), 0);
	unordered_map<string, set<string>> report_count;
	unordered_map<string, int> id_index;

	for (int i = 0; i < report.size();i++) {
		string first, second;

		stringstream sstream;
		sstream.str(report[i]);
		sstream >> first >> second;
		report_count[second].insert(first);
	}

	for (int i = 0; i < id_list.size();i++) 
		id_index[id_list[i]] = i;

	
	for (auto it : report_count) {
		if (it.second.size() >= k) {
			for (auto set_it : it.second) {
				int idx = id_index[set_it];
				answer[idx]++;
			}
		}
	}

	return answer;
}​

+ Recent posts