[프로그래머스] 신고 결과 받기 (C++, 카카오)

0

programmers

목록 보기
2/2

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

요 몇일간 면접, 인적성, 필기 등 각종 시험이 겹쳐서 블로그에 게시하지 못했다..
좀 더 열심히 해봐야겠다!

이 문제는 map, set 자료구조를 이용해 풀었다.
map을 쓴 이유는 key-value 형태여서 신고 횟수를 저장하기에 적당할 것 같아서 사용했고,
set은 중복을 처리해주기 위해 사용했다.

문제 해결 방법은 다음과 같다.

  1. map<string, set>으로 선언해, 신고 받은자와 신고자를 동시에 저장할 수 있게 해준다.
  2. report를 돌면서 신고자와 신고 받은자를 저장해준다.
  3. 전체 id_list를 돌면서 저장했던 신고자가 k 이상일 경우, set을 돌면서 별도의 배열에 신고자를 체크해준다.
#include <string>
#include <vector>
#include <map>
#include <iostream>
#include <set>
#include <algorithm>

using namespace std;

vector<int> solution(vector<string> id_list, vector<string> report, int k) {
    vector<int> answer;
    // map으로 신고받은 자와 신고자를 연결해준다.
    map<string, set<string>> alert;
    // 나중에 신고자를 계산할 때 쓰는 별도의 배열 
    int mail[1001];
    for (int i = 0; i < 1001; i++) mail[i] = 0;
    for (int i = 0; i < report.size(); i++) {
        // 공백 기준으로 잘라서
        int index = report[i].find(" ");
        // 신고자에 신고 받은자를 set에 담아준다.
        alert[report[i].substr(index + 1)].insert(report[i].substr(0, index));
    }
    // 전체 list를 돌면서
    for (int i = 0; i < id_list.size(); i++) {
        // 신고자가 k 이상이면
        if (alert[id_list[i]].size() >= k) {
            // set을 돌면서 별도의 배열에 신고자를 체크해준다.
            for (auto it = alert[id_list[i]].begin(); it != alert[id_list[i]].end(); it++) {
                int index = find(id_list.begin(), id_list.end(), *it) - id_list.begin();
                mail[index]++;
            }
        }
    }
    for (int i = 0; i < id_list.size(); i++) {
        answer.push_back(mail[i]);
    }
    return answer;
}

0개의 댓글