[프로그래머스] LEVEL1 : 신고 결과 받기 C++

    반응형

    #INFO

    문제 : 신고 결과 받기

    난이도 : LEVEL1

    출처 : 2022 KAKAO BLIND RECRUITMENT

    코드 참고 : https://yjyoon-dev.github.io/kakao/2022/01/15/kakao-2022-blind-01/

    코딩테스트 연습 - 신고 결과 받기 | 프로그래머스 (programmers.co.kr)


    #SOLVE

    "Tokenizng(문자열 파싱)""map 자료구조"에 대해 공부할 수 있는 좋은 문제였다.

    문제 조건에서 주어진 solution 함수의 각 parameter를 분석해 보자면 다음과 같다.

    _about Tokenizing

     

    id_list : user의 id가 담긴 문자열 벡터이다.

    report : 각 user가 신고한 다른 user의 ID 정보가 담긴 문자열 벡터이다.ex) muzi frodo _ muzi가 frodo를 신고함

    k : 정지의 기준이 되는 신고 횟수이다.

    // id_list : 사용자의 ID가 담긴 문자열 벡터
    // report : 신고한 ID와 신고당한 ID가 공백으로 구분되어 저장된 정보가 담긴 문자열 벡터
    // k : 정지 기준이 되는 신고 횟수
    vector<int> solution(vector<string> id_list, vector<string> report, int k){
    	vector<int> answer;
    	return answer;
    }

     

    문제 풀이에서 사용할 자료구조는 다음과 같다.

    map<string, int> userCnt : 유저별로 신고당한 횟수를 저장할 map

    map<string, set<string>> : 유저별로 신고한 또 다른 유저들의 목록을 저장할 map

    map<string, int> userCnt;  // 각 유저별로 신고당한 횟수를 저장하는 자료구조
    map<string, set<string>> userLog; // 각각의 유저가 신고한 또 다른 유저의 정보를 저장하는 자료구조

     

    find함수와 substr함수를 사용해 공백을 기준으로 report에 저장된 문자열들을 from, to string에 각각 Tokenizing한다.

    from에는 신고한 user의 정보가 저장되고, to에는 신고당한 user의 정보가 저장된다.

    userLog를 탐색해 user "from"이 user "to"를 신고한 이력이 없을 경우 로그를 갱신하고, user "to"의 신고 당한 횟수를 추가한다.

    	for(string s : report){
    		// 공백 기준 문자열 파싱
    		int blank = s.find(" ");
    		string from = s.substr(0, blank);
    		string to = s.substr(blank);
    		// user "from"이 user "to"를 신고한 이력이 없는 경우 로그를 갱신한다.
    		// ** find 함수는 탐색에 실패했을 경우 마지막 이터레이터를 반환한다. **
    		if(userLog[from].find(to) == userLog[from].end()){
    			userLog[from].insert(to);
    			userCnt[to]++;
    		}
    	}

     

    마지막으로 userLog를 탐색해 신고횟수가 k번을 초과할 시 mail_cnt(정지 메일 횟수)를 추가한 뒤, answer 벡터에 각 유저별로 보내야 할 총 정지 메일 횟수를 푸시해주면 된다.

    	for(string id : id_list){
    		int mail_cnt = 0;
    		for(string str : userLog[id]){
    			if(userCnt[str] >= k) mail_cnt++;
    		}
    		answer.push_back(mail_cnt);
    	}

    #CODE

    #include <string>
    #include <vector>
    #include <map>
    #include <set>
    using namespace std;
    
    map<string, int> userCnt;  // 각 유저별로 신고당한 횟수를 저장하는 자료구조
    map<string, set<string>> userLog; // 각각의 유저가 신고한 또 다른 유저의 정보를 저장하는 자료구조
    
    // id_list : 사용자의 ID가 담긴 문자열 벡터
    // report : 신고한 ID와 신고당한 ID가 공백으로 구분되어 저장된 정보가 담긴 문자열 벡터
    // k : 정지 기준이 되는 신고 횟수
    vector<int> solution(vector<string> id_list, vector<string> report, int k){
    	vector<int> answer;
    	for(string s : report){
    		// 공백 기준 문자열 파싱
    		int blank = s.find(" ");
    		string from = s.substr(0, blank);
    		string to = s.substr(blank);
    		// user "from"이 user "to"를 신고한 이력이 없는 경우 로그를 갱신한다.
    		// ** find 함수는 탐색에 실패했을 경우 마지막 이터레이터를 반환한다. **
    		if(userLog[from].find(to) == userLog[from].end()){
    			userLog[from].insert(to);
    			userCnt[to]++;
    		}
    	}
    	
    	for(string id : id_list){
    		int mail_cnt = 0;
    		for(string str : userLog[id]){
    			if(userCnt[str] >= k) mail_cnt++;
    		}
    		answer.push_back(mail_cnt);
    	}
    	return answer;
    }
    반응형

    댓글

    Designed by JB FACTORY