[프로그래머스] 2022 KAKAO BLIND 신고 결과 받기 C++

거북이·2022년 3월 23일
0

문제풀이

목록 보기
5/11

문제 링크


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

문제 풀이


유저 목록과, 신고 내역이 배열로 주어지고, 신고 성공에 대한 기준 횟수 k 가 입력으로 주어질 때 k번 이상 신고된 유저는 게시판 사용이 정지가 되며 이를 신고한 유저들은 메일을 받게 된다. 그랬을 때 각 유저가 메일을 받은 횟수를 배열에 담아 출력하면 되는 문제로 map을 활용하여 다음과 같이 풀이하였다.

  • 신고 내역에 신고한 유저와 신고를 받은 유저가 합해져 있기 때문에 공백을 기준으로 문자열 파싱을 해준다. - userId / xId(신고를 받은 ID)
  • 신고받은 유저를 키값으로 가지고 이를 신고한 유저들을 set value로 가지는 map xId에 저장한다
    • set을 사용한 이유는 중복신고 제거를 위함.
  • xId를 탐색하면서 value의 크기가 k 이상인 경우 신고한 유저들을 카운트 해준다. userId[j]++
  • 마지막으로 유저목록 순서대로 출력을 해야하는 조건을 지키기 위해 id_list를 순차탐색하며 userId와 비교해준다.
    • userIdid_list값이 없다는 것은 신고에 성공한유저가 없다는 것이다.
    • 값이 존재한다면 메일을 받은 횟수를 저장할 배열 answerpush_back 해준다.

정답 코드



#include<iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <set>;

using namespace std;

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

    
    map<string, int> userId;
    map<string, set<string>> xId;

    //report 탐색
    for (int i = 0; i < report.size(); i++) {

        //문자열 파싱
        string from;
        string to;
        int blank = report[i].find(' ');
        from = report[i].substr(0, blank);
        to = report[i].substr(blank);

        xId[to].insert(from);
    }

    //xId 탐색
    for (auto i : xId) {
        if (i.second.size() >= k) { // 신고횟수가 k번 이상인가?
            for (auto j : i.second) {
                userId[j]++;
            }
        }
    }

    //id_list 탐색
    for (int i = 0; i < id_list.size(); i++) {
        if (userId.find(id_list[i])!=userId.end()) {
            answer.push_back(userId[id_list[i]]);
        }
        else {
            answer.push_back(0);
        }
    }
    return answer;
}

0개의 댓글

관련 채용 정보