N

(프로그래머스 c++ KAKAO)신고 결과 받기 본문

프로그래머스 알고리즘/KAKAO

(프로그래머스 c++ KAKAO)신고 결과 받기

naeunchan 2022. 5. 4. 09:15
728x90
반응형

https://programmers.co.kr/learn/courses/30/lessons/92334?language=cpp 

 

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

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

programmers.co.kr

map을 이용한 문제 풀이.

 

3개의 map을 선언하였다.

reported는 <string, int>로 유저가 신고를 받은 횟수를 카운팅한다.

done은 <string, bool>로 한 유저가 동일한 유저에 대해 신고를 여러번 했는지 확인하기 위한 map이다.

target은 <string, vector<string>으로 유저 별 신고한 유저를 저장한다.

 

먼저 report를 순회한다.

report는 띄어쓰기를 기준으로 "이용자id 신고한id"로 되어있기 때문에,

token으로 문자열을 split 한다.

split 한 결과를 str에 저장하며, 0번째 인덱스에는 이용자 id, 1번째 인덱스에는 신고한 id가 저장된다.

이제 done map을 이용하여 중복 신고 여부를 확인한다.

report[i]를 key로 가지면서, 이에 해당하는 value가 false라면 최초 신고다.

최초 신고에 해당하면, done[report[i]] = true로 바꿔준다.

또한, reported[str[1]]++을 하여 신고당한 유저의 횟수를 카운팅해주며,

마지막으로는 target map에서 이용자 id(str[0]를 key로 가지는 value(vector<string> 형태)에 신고한 id(str[1])을 push해주도록 한다.

 

만약 done[report[i]] == true라면 중복 신고이기 때문에 아무런 일도 일어나지 않는다.

 

report를 순회했으니, id_list를 순회하여 정답을 찾아낸다.

이중 for문을 이용.

id_list를 순회하고, target map에서 id_list[i]를 key로 가지는 value를 순회한다.

value는 vector<string>이기 때문에 간단하게 auto itr로 순회를 했다.

map의 반복자는 *itr이 value를 나타내기 때문에, report[*itr]을 하면 신고받은 유저의 횟수를 알아낼 수 있다.

report[*itr] >= k 이상이면 count++을 해주고,

내부 for문이 끝나면 answer.push_back(count)를 한다.

#include <string>
#include <map>
#include <vector>
#include <sstream>
#include <iostream>

using namespace std;

vector<int> solution(vector<string> id_list, vector<string> report, int k) {
    vector<int> answer;
    map<string, int> reported;
    map<string, bool> done;
    map<string, vector<string>> target;
    
    for(int i = 0; i < report.size(); i++){
        string str[2];
        string token;
        stringstream ss(report[i]);
        int index = 0;
        
        while(ss >> token){
            str[index++] = token;
        }
        
        if(!done[report[i]]){
            done[report[i]] = true;
            reported[str[1]]++;
            target[str[0]].push_back(str[1]);
        }
    }
    
    for(int i = 0; i < id_list.size(); i++){
        int count = 0;
        
        for(auto itr = target[id_list[i]].begin(); itr != target[id_list[i]].end(); itr++){
            if(reported[*itr] >= k){
                count++;
            }
        }
        
        answer.push_back(count);
    }
    
    return answer;
}
728x90
반응형