요 몇일간 면접, 인적성, 필기 등 각종 시험이 겹쳐서 블로그에 게시하지 못했다..
좀 더 열심히 해봐야겠다!
이 문제는 map, set 자료구조를 이용해 풀었다.
map을 쓴 이유는 key-value 형태여서 신고 횟수를 저장하기에 적당할 것 같아서 사용했고,
set은 중복을 처리해주기 위해 사용했다.
문제 해결 방법은 다음과 같다.
#include <string>
#include <vector>
#include <map>
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
vector<int> solution(vector<string> id_list, vector<string> report, int k) {
vector<int> answer;
// map으로 신고받은 자와 신고자를 연결해준다.
map<string, set<string>> alert;
// 나중에 신고자를 계산할 때 쓰는 별도의 배열
int mail[1001];
for (int i = 0; i < 1001; i++) mail[i] = 0;
for (int i = 0; i < report.size(); i++) {
// 공백 기준으로 잘라서
int index = report[i].find(" ");
// 신고자에 신고 받은자를 set에 담아준다.
alert[report[i].substr(index + 1)].insert(report[i].substr(0, index));
}
// 전체 list를 돌면서
for (int i = 0; i < id_list.size(); i++) {
// 신고자가 k 이상이면
if (alert[id_list[i]].size() >= k) {
// set을 돌면서 별도의 배열에 신고자를 체크해준다.
for (auto it = alert[id_list[i]].begin(); it != alert[id_list[i]].end(); it++) {
int index = find(id_list.begin(), id_list.end(), *it) - id_list.begin();
mail[index]++;
}
}
}
for (int i = 0; i < id_list.size(); i++) {
answer.push_back(mail[i]);
}
return answer;
}