코딩테스트 연습 > 2022 KAKAO BLIND RECRUITMENT > 신고 결과 받기

10/10

문제 이해 + 전체적인 풀이 흐름 구상 정리

#include <string>
#include <vector>
#include <map>
#include <iostream>
using namespace std;

vector<int> solution(vector<string> id_list, vector<string> report, int k) {

    map<string, int>m; // id_list의 이름별로 번호를 매겨서 map에 저장
    for(int i =0; i<id_list.size(); i++) m[id_list[i]] = i;
    
    vector<vector<bool>>v(id_list.size(), vector<bool>(id_list.size(), 0));
    // 누가 누구를 신고했는지 기록하는 2차원 vector(중복신고 여부 확인 위함)
    // v[신고 한 사람][신고 당한 사람]
    
    vector <int> cnt(id_list.size(),0); // 신고 횟수 cnt vector
    for(auto r : report){
        for(int i =0; i<r.size(); i++){
            if(r[i] == ' '){
                int p1 = m[r.substr(0, i)]; //신고자
                int p2 = m[r.substr(i+1, r.size())]; // 신고 당한사람
                if(!v[p1][p2]){ // 최초신고일 경우에만
                    v[p1][p2] = 1; // 신고한걸로 바꾸기
                    cnt[p2]++; // 신고 당한 횟수++;
                }
                break;
            }
        }
    }
    
    vector<int> answer(id_list.size(),0); // 최종 처리 결과 메일 횟수 vector;
    for(int i =0; i<cnt.size(); ++i){
        if(cnt[i] >= k){
            for(int j =0; j<cnt.size(); ++j){
                if(v[j][i]) answer[j]++;
            }
        }
    }
    
    return answer;
}

한방에 성공 ☆

+ Recent posts