https://school.programmers.co.kr/learn/courses/30/lessons/92334#
이 문제는 주어진 배열 중 중복 된 것이 있는지 찾으면 해결할 수 있다.
id_list 배열에는 유저의 이름이 저장되어 있다. 또한 report 배열 속에는 공백을 기준으로 신고 내역이 저장되어 있다.
따라서 신고자들이 신고한 유저의 내역과 신고당한 유저의 신고 횟수를 저장을 해야한다.
이를 map 자료 구조를 통해 저장하였다.
신고당한 유저의 신고횟수를 0으로 초기화 한 후 신고한 유저의 내역을 저장하였다.
이때 공백을 기준으로 신고자와 피신고자의 이름을 구하고 신고자에게 배열을 통해 피신고자의 이름을 삽입하였다.
이후 같은 사람이 2번 신고할 수 없다는 규칙을 위해 erase 함수와 unique함수를 통해 중복을 제거하였다.
이때 unique 함수의 경우 같은 값은 연속되어야 찾을 수 있다는 특징을 활용하기 위해 정렬을 사용하였다.
마지막으로 k를 기준으로 k이상인 경우 메일 전송 횟수를 증가 시키고 answer 배열에 삽입하였다.
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
map<string,vector<string>> table;
map<string,int> targetTable;
vector<int> solution(vector<string> id_list, vector<string> report, int k) {
vector<int> answer;
for(int i = 0;i<id_list.size();i++){
string name = id_list[i];
targetTable[name] = 0;
}
for(int i = 0;i<report.size();i++){
int pos = 0;
for(int j = 0;j<report[i].length();j++)
if(report[i][j] == ' ') pos = j;
string reporter = report[i].substr(0, pos);
string target = report[i].substr(pos + 1);
table[reporter].push_back(target);
}
for(int i = 0;i<id_list.size();i++){
string name = id_list[i];
if(!table[name].empty()){
sort(table[name].begin(),table[name].end());
table[name].erase(unique(table[name].begin(),table[name].end()),table[name].end());
for(int j = 0;j<table[name].size();j++){
targetTable[table[name][j]]++;
}
}
}
for(int i = 0;i<id_list.size();i++){
string name = id_list[i];
int count = 0;
for(int j = 0;j<table[name].size();j++){
if(targetTable[table[name][j]]>=k) count++;
}
answer.push_back(count);
}
return answer;
}
'Programmers Review' 카테고리의 다른 글
[Lv 1] 로또의 최고 순위와 최저 순위 (0) | 2024.06.07 |
---|---|
[Lv 1] 숫자 문자열과 영단어 (0) | 2024.06.07 |
[Lv 1] 성격 유형 검사하기 (0) | 2024.06.07 |
[Lv 1] 숫자 짝꿍 (0) | 2024.06.07 |
[Lv 1] 최소직사각형 (0) | 2024.06.07 |