자신이 신고를 한 유저 중 신고를 k번 이상 당한 유저가 몇명이 있는지를 파악하는 문제이다.
해당 문제를 풀기 위해서 단계에 걸쳐서 문제를 풀었다.
1. 문자열 나누기를 통해서 신고한 유저와 신고당한 유저 나누기.
2. 신고를 한 사람은 같은 사람을 1번만 가능하게 중복 제거하기.
3. 신고를 몇번 당했는지 체크해주기.
4. 만일 신고를 k번 이상 당했다면 신고한 사람의 value 증가해주기.
5. id_list를 방문하면서 해당 사람의 value 값 answer에 넣기.
의 다섯 단계로 나누어서 해당 문제를 풀었다.
모두 구현만 하면 되지만 단계를 나누어서 풀기가 처음엔 어려울 수 있으니 차근차근 접근하면서 풀자.
[회고]
카카오 문제는 문자열 이용이 기본으로 들어가서 난이도가 다른 것들보다 더 어렵게 느껴지는 경향이 있다.
JSON 파일 처리에도 문자열 공부는 도움이 되니 꾸준히 풀자.
[코드]
#include <string>
#include <vector>
#include <iostream>
#include <sstream>
#include <map>
#include <algorithm>
using namespace std;
vector<string> split(string s){
vector<string> answer;
char delimeter = ' ';
string buffer;
istringstream iss(s);
while(getline(iss,buffer,delimeter)){
answer.push_back(buffer);
}
return answer;
}
vector<int> solution(vector<string> id_list, vector<string> report, int k) {
vector<int> answer;
//신고당한 횟수를 체크해 줄 변수
map<string ,int > mp;
//신고를 한 사람을 체크해 줄 변수
map<string, int> person;
//신고한 사람과 신고 당한 사람으로 나눌 변수
vector<vector<string> > declare;
//1. 신고한 유저와 신고당한 유저 나누기.
for(int i = 0;i<report.size();i++){
vector<string> temp;
temp = split(report[i]);
declare.push_back(temp);
}
//2. 신고를 한 사람은 같은 사람을 1번만 가능하게 중복 제거하기.
sort(declare.begin(),declare.end());
declare.erase(unique(declare.begin(),declare.end()),declare.end());
//3. 신고를 몇번 당했는지 체크해주기.
for(int i = 0;i<declare.size();i++){
mp[declare[i][1]]++;
}
//4. 만일 신고를 k번 이상 당했다면 신고한 사람의 value 증가해주기.
for(int i = 0;i<declare.size();i++){
if(mp[declare[i][1]] >= k){
person[declare[i][0]]++;
}
}
//5.id_list를 방문하면서 해당 사람의 value 값 answer에 넣기.
for(int i = 0;i<id_list.size();i++){
answer.push_back(person[id_list[i]]);
}
return answer;
}