coding_test/programmers

lv1 / 신고 결과 받기 / 카카오 기출 / C++, Python

CodeJin 2022. 6. 29. 15:51

https://programmers.co.kr/learn/courses/30/lessons/92334

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr


한 유저가 같은 유저를 여러번 신고했다면 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