https://programmers.co.kr/learn/courses/30/lessons/92334
한 유저가 같은 유저를 여러번 신고했다면 report 벡터에는 같은 문자열이 여러개 들어있다는 뜻이다. 이를 알아냈다면 단순히 report벡터를 사용하기 전에 중복을 제거해주면 된다. 이후로는 신고 당한 횟수를 세고, 그 횟수가 k보다 많으면 메일을 날리면 되니까 이를 순서대로 하면 된다.
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <utility>
#define all(x) (x).begin(), (x).end()
using namespace std;
inline int get_index(vector<string>& id_list, string& name) {
for(int i = 0; i < id_list.size(); i++)
if (id_list[i] == name) return i;
}
vector<int> solution(vector<string> id_list, vector<string> report, int k) {
vector<int> answer(id_list.size(), 0); // 답
vector<int> report_cnt(id_list.size(), 0); // 각 유저가 신고당한 횟수
pair<string, string> user_report; // <유저id, 유저가 신고한 id>
// report 중복 제거, 동일 유저가 한 유저를 여러번 신고했다면, 같은 형식의 데이터가 여러개 들어있을 수 밖에 없다.
sort(all(report));
report.erase(unique(all(report)), report.end());
// 신고당한 횟수 작성
for(auto rp : report) {
stringstream ss(rp);
getline(ss, user_report.first, ' ');
getline(ss, user_report.second, ' ');
report_cnt[get_index(id_list, user_report.second)]++;
}
// 답안 작성
for(auto rp : report) {
stringstream ss(rp);
getline(ss, user_report.first, ' ');
getline(ss, user_report.second, ' ');
if (report_cnt[get_index(id_list, user_report.second)] >= k)
answer[get_index(id_list, user_report.first)]++;
}
return answer;
}
def solution(id_list, report, k):
answer = [0 for _ in id_list]
report_cnt = [0 for _ in id_list]
user = ""
user_report = ""
# 중복 제거
report = list(set(report))
for rp in report:
user, user_report = rp.split(" ")
report_cnt[id_list.index(user_report)] += 1
for rp in report:
user, user_report = rp.split(" ")
if report_cnt[id_list.index(user_report)] >= k:
answer[id_list.index(user)] += 1
return answer
'coding_test > programmers' 카테고리의 다른 글
lv2 / 문자열 압축 / 카카오 기출 / C++ (0) | 2022.07.13 |
---|---|
lv1 / 소수 만들기 / C++ (0) | 2022.06.29 |
lv1 / 최대공약수와 최소공배수 / C++ (0) | 2022.02.06 |
lv1 / 제일 작은 수 제거하기 / C++ (0) | 2022.02.06 |
lv1 / 자연수 뒤집어 배열로 만들기 / C++ (0) | 2021.12.20 |