본문 바로가기

코딩테스트/프로그래머스

[프로그래머스] 신고 결과 받기

728x90
반응형


🔗 문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


👩‍💻 코드

#include <string>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <sstream>
#include <algorithm>

using namespace std;

vector<int> solution(vector<string> id_list, vector<string> report, int k) {
    vector<int> answer(id_list.size(), 0);
    unordered_map<string, unordered_set<string>> reporter_map;
    unordered_map<string, int> reported_map;

    sort(report.begin(), report.end());
    report.erase(unique(report.begin(), report.end()), report.end());

    for(const string& r : report){
        stringstream ss(r);
        string reporter_name, reported_name;
        ss >> reporter_name >> reported_name;
        reporter_map[reporter_name].insert(reported_name);
        reported_map[reported_name] += 1;
    }

    for(const auto& reported : reported_map){
        if(reported.second >= k){
            for(const auto& reporter : reporter_map){
                if(reporter.second.find(reported.first) != reporter.second.end()){
                    auto it = find(id_list.begin(), id_list.end(), reporter.first);
                    if(it != id_list.end()){
                        int idx = distance(id_list.begin(), it);
                        answer[idx] += 1;
                    }
                }
            }
        }
    }

    return answer;
}

📝 풀이

reporter_map -> 유저가 신고한 목록
reported_map -> 유저가 신고된 횟수

 

sort와 erase를 통해 중복(한 유저가 여러번) 신고 제거

 

첫 번째 for문에서 report의 정보를 reporter_map과 reported_map에 입력

 

그 다음 for문에서 k번 이상 신고된 유저의 경우 신고한 유저의 index를 찾아 증가시킴

728x90
반응형