티스토리 뷰

성공 코드(내 코드)

  • 2차원 벡터 organize에 report의 내용을 정리한다.
    • id_list의 사이즈만큼 n*n 2차원 배열 organize를 생성한다.
    • 각각의 행과 열은 id_list의 인덱스 값에 해당되는 사람을 나타내고
      • 행에 해당되는 사람이 누구를 신고했는지 해당 행의 원소들에 체크를 하게 된다.
        • 0을 1로 바꿈으로써 체크가 이루어진다. 이렇게 함으로써 중복되는 신고는 한번으로 처리 가능하다.
  • organize의 각각의 열을 탐색하며 k번 이상 신고된 자의 인덱스를 stopped 벡터에 추가한다.
  • organize를 행마다 탐색하며 이때 cnt는 0이 된다.
    • stopped가 체크되어 있으면 cnt를 증가시켜 메일을 받은 횟수를 증가시킨다.
    • 그리고 해당 행의 탐색이 끝나면 answer 벡터에 cnt의 값을 넣는다.
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<string> id_list, vector<string> report, int k) {
    vector<int> answer;
    vector<vector <int>> organize(id_list.size(), vector<int>(id_list.size()));
    vector<int> stopped;
    
    for(int i=0; i<report.size(); i++){
        int mid=report[i].find(" ");
        int reporter = find(id_list.begin(), id_list.end(), report[i].substr(0, mid))-id_list.begin();
        int reported = find(id_list.begin(), id_list.end(), report[i].substr(mid+1, report[i].size()-mid-1))-id_list.begin();
        
        if(organize[reporter][reported]==0){
            organize[reporter][reported]=1;
        }
    }
    
    for(int i=0; i<id_list.size(); i++){
        int cnt=0;
        for(int j=0; j<id_list.size(); j++){
            if(organize[j][i]==1){
                cnt++;
            }
            if(cnt>=k){
                stopped.push_back(i);
                break;
            }
        }
    }
    for(int i=0; i<id_list.size(); i++){
        int cnt=0;
        for(int j=0; j<stopped.size(); j++){
            if(organize[i][stopped[j]]==1){
                cnt++;
            }
        }
        answer.push_back(cnt);
    }
    
    return answer;
}

다른 사람 풀이

  • id_list의 값들을 map을 이용해  Conv에 저장한다.
    • Conv는 string과 int로 이루어져 있다.
  • sort 후 중복 신고를 제거하기 위해 unique후 erase 한다.
  • stringstream을 통해 report의 내용을 " "를 제외하고 두 string으로 빼낸다.
  • 벡터 v에 뽑아낸 두 문자열에 맞게 pair를 Conv를 이용하여 만들어 넣는다.
  • v를 탐색하며
    • 벡터 cnt에 사람별로 신고당한 횟수를 저장하고
  • v를 탐색하며
    • 벡터 cnt 원소의 값이 k 이상인 원소에 대하여
      • 메일을 받은 횟수를 나타내는 벡터 ret에서 신고한 사람의 인덱스에 해당되는 ret 원소의 값을 1 증가시킨다.

문자열을 나누는 stringstream

  • 주어진 문자열에서 필요한 자료형에 맞는 정보를 꺼낼 때 유용하게 사용된다.
  • stringstream에서 공백과 '\n\을 제외하고 문자열에 맞는 자료형의 정보를 빼낸다.
    • #include <<sstream> 전처리 헤더를 필수로 포함해야 한다.
    • stream.str(string str)은 현재 stream의 값을 문자열 str로 바꾼다.
    • stringstream 초기화
      • stream.str(""); 구문을 통해 초기화한다.
#include <bits/stdc++.h>
#define fastio cin.tie(0)->sync_with_stdio(0)
using namespace std;

vector<int> solution(vector<string> id_list, vector<string> report, int k) {
    // 1.
    const int n = id_list.size();
    map<string, int> Conv;
    for (int i = 0; i < n; i++) Conv[id_list[i]] = i;

    // 2.
    vector<pair<int, int>> v;
    sort(report.begin(), report.end());
    report.erase(unique(report.begin(), report.end()), report.end());
    for (const auto& s : report) {
        stringstream in(s);
        string a, b; in >> a >> b;
        v.push_back({ Conv[a], Conv[b] });
    }

    // 3.
    vector<int> cnt(n), ret(n);
    for (const auto& [a, b] : v) cnt[b]++;
    for (const auto& [a, b] : v) if (cnt[b] >= k) ret[a]++;
    return ret;
}