신고한 사람들을 신고받은 사람의 벡터에 넣어주었고 그 숫자가 k를 넘게된다면 answer[신고한 사람 인덱스]++ 을 해주었다.
문제를 잘못 이해해서 푸는데 좀 애를 많이 먹은 문제이다. 중복에 대한 부분은 map을 사용한다던지 정렬을 하여 unique함수를 사용한다던지 하여
좀더 효율적으로 코드를 작성할 수 있을것 같다. 다른분의 더 좋은 코드는 밑에서 작성하였다.
#include <string>
#include <vector>
using namespace std;
int find_idx(vector<string> id_list, string s)// id_list에서의 인덱스 찾아주는 함수
{
for(int i=0;i<id_list.size();i++)
{
if(id_list[i].size() != s.size()) continue;
for(int j=0;j<id_list[i].size();j++)
{
if(id_list[i][j] != s[j]) break;
if(j == id_list[i].size() - 1) return i;
}
}
return -1;
}
bool is_dup(vector<int> v, int idx1)// 중복 신고인지
{
for(int i=0;i<v.size();i++)
if(v[i] == idx1) return true;
return false;
}
vector<int> solution(vector<string> id_list, vector<string> report, int k)
{
vector<int> answer;
vector<vector<int>> v;
for(int i=0;i<id_list.size();i++)
v.push_back(answer);
for(int i=0;i<id_list.size();i++) answer.push_back(0);
for(int i=0;i<report.size();i++)
{
string s1="", s2="";
bool flag = true;
for(int j=0;j<report[i].size();j++)
{
if(report[i][j] == ' ') flag = false;
else if(flag) s1.push_back(report[i][j]);
else s2.push_back(report[i][j]);
}
int idx1 = find_idx(id_list, s1), idx2 = find_idx(id_list, s2);// idx1 : 신고자 인덱스, idx2 : 신고받은 사람 인덱스
if(!is_dup(v[idx2], idx1)) v[idx2].push_back(idx1);
}
for(int i=0;i<id_list.size();i++)
{
if(v[i].size() >= k)
for(int j=0;j<v[i].size();j++) answer[v[i][j]]++;
}
return answer;
}
효율적인 코드
#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;
vector<int> solution(vector<string> id_list, vector<string> report, int k) {
// 1.
const int n = id_list.size();
map<string, int> Conv;
for (int i = 0; i < n; i++) Conv[id_list[i]] = i;
// 2.
vector<pair<int, int>> v;
sort(report.begin(), report.end());
report.erase(unique(report.begin(), report.end()), report.end());
for (const auto& s : report) {
stringstream in(s);
string a, b; in >> a >> b;
v.push_back({ Conv[a], Conv[b] });
}
// 3.
vector<int> cnt(n), ret(n);
for (const auto& [a, b] : v) cnt[b]++;
for (const auto& [a, b] : v) if (cnt[b] >= k) ret[a]++;
return ret;
}