프로그래머스 - 신고결과 받기 - C++
https://school.programmers.co.kr/learn/courses/30/lessons/92334
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
#include <string>
#include <vector>
#include <map>
using namespace std;
vector<int> solution(vector<string> id_list, vector<string> report, int k) {
vector<int> answer;
map<string,vector<string>> reportList;
map<string,int> num;
for(int i=0;i<id_list.size();i++)
{
num.insert({id_list[i],0});
vector<string> a;
reportList.insert({id_list[i],a});
}
for(int i=0;i<report.size();i++)
{
int idx = report[i].find(' ');
string a = report[i].substr(0,idx);
string b = report[i].substr(idx+1);
bool t = true;
for(int j=0;j<reportList[a].size();j++)
{
if(reportList[a][j]==b)
{
t=false;break;
}
}
if(t)
{
reportList[a].push_back(b);
num[b]++;
}
}
for(int i=0;i<id_list.size();i++)
{
int cnt=0;
for(int j=0;j<reportList[id_list[i]].size();j++)
{
if(num[reportList[id_list[i]][j]]>=k)
cnt++;
}
answer.push_back(cnt);
}
return answer;
}
id_list에 유저목록이 report에는 muzi frodo 처럼 공백을 기준으로 유저id와 유저가 신고한 아이디 목록이 있다.
그리고 신고누적횟수가 k번이상이면 신고한 유저에게 피드백을 주게되며 각 유저가 피드백을 몇번 받는지를 리턴하는 문제이다.
맵 두개를 이용해서 reportList는 각 유저가 누구를 신고했는지를 리스트로 만들고
num은 각 유저가 몇번 신고당했는지를 나타낸다.
for(int i=0;i<report.size();i++)
{
int idx = report[i].find(' ');
string a = report[i].substr(0,idx);
string b = report[i].substr(idx+1);
bool t = true;
for(int j=0;j<reportList[a].size();j++)
{
if(reportList[a][j]==b)
{
t=false;break;
}
}
if(t)
{
reportList[a].push_back(b);
num[b]++;
}
}
데이터 분석과정이다.
공백을 기준으로 두개의 string으로 나누고 중복신고인지를 판단한다.
아니라면 reportList에 리스트로추가하고 신고당한유저의 카운트를 1증가시킨다.
for(int i=0;i<id_list.size();i++)
{
int cnt=0;
for(int j=0;j<reportList[id_list[i]].size();j++)
{
if(num[reportList[id_list[i]][j]]>=k)
cnt++;
}
answer.push_back(cnt);
}
reportList를 통해서 id_list[i]번째 유저가 누구를 신고했는지, 또 그 신고한 유저가 k번 넘게 신고당했는지를 num에서 확인하고 cnt를 증가시킨다.
+추가
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
vector<int> solution(vector<string> id_list, vector<string> report, int k) {
vector<int> answer;
map<string,vector<string>> reportList;
map<string,int> num;
for(int i=0;i<id_list.size();i++)
{
num.insert({id_list[i],0});
vector<string> a;
reportList.insert({id_list[i],a});
}
sort(report.begin(),report.end());
report.erase(unique(report.begin(),report.end()),report.end());
for(int i=0;i<report.size();i++)
{
int idx = report[i].find(' ');
string a = report[i].substr(0,idx);
string b = report[i].substr(idx+1);
reportList[a].push_back(b);
num[b]++;
}
for(int i=0;i<id_list.size();i++)
{
int cnt=0;
for(int j=0;j<reportList[id_list[i]].size();j++)
{
if(num[reportList[id_list[i]][j]]>=k)
cnt++;
}
answer.push_back(cnt);
}
return answer;
}
중복확인에 대한 부분을 report는 놔둔 상태에서 reportList에서 있는지 유무를 확인했는데
unique와 erase를 통해 애초에 report에서 제거하면 시간이 훨신 단축되는 것을 알았다.
unique함수는 간단히 말하면 연속되는 중복된 원소를 제거해준다.
따라서 report를 정렬한 후에 unique 함수를 erase와 사용하면 중복되는 모든 원소가 제거된다.