C++:: 프로그래머스 <신고 결과 받기>

jahlee·2023년 3월 3일
0

프로그래머스_Lv.1

목록 보기
6/75
post-thumbnail

신고한 사람들을 신고받은 사람의 벡터에 넣어주었고 그 숫자가 k를 넘게된다면 answer[신고한 사람 인덱스]++ 을 해주었다.
문제를 잘못 이해해서 푸는데 좀 애를 많이 먹은 문제이다. 중복에 대한 부분은 map을 사용한다던지 정렬을 하여 unique함수를 사용한다던지 하여
좀더 효율적으로 코드를 작성할 수 있을것 같다. 다른분의 더 좋은 코드는 밑에서 작성하였다.

#include <string>
#include <vector>
using namespace std;

int find_idx(vector<string> id_list, string s)// id_list에서의 인덱스 찾아주는 함수
{
    for(int i=0;i<id_list.size();i++)
    {
        if(id_list[i].size() != s.size()) continue;
        for(int j=0;j<id_list[i].size();j++)
        {
            if(id_list[i][j] != s[j]) break;
            if(j == id_list[i].size() - 1) return i;
        }
    }
    return -1;
}

bool is_dup(vector<int> v, int idx1)// 중복 신고인지
{
    for(int i=0;i<v.size();i++)
        if(v[i] == idx1) return true;
    return false;
}

vector<int> solution(vector<string> id_list, vector<string> report, int k)
{
    vector<int> answer;
    vector<vector<int>> v;
    for(int i=0;i<id_list.size();i++)
        v.push_back(answer);
    for(int i=0;i<id_list.size();i++) answer.push_back(0);
    for(int i=0;i<report.size();i++)
    {
        string s1="", s2="";
        bool flag = true;
        for(int j=0;j<report[i].size();j++)
        {
            if(report[i][j] == ' ') flag = false;
            else if(flag) s1.push_back(report[i][j]);
            else s2.push_back(report[i][j]);
        }
        int idx1 = find_idx(id_list, s1), idx2 = find_idx(id_list, s2);// idx1 : 신고자 인덱스, idx2 : 신고받은 사람 인덱스
        if(!is_dup(v[idx2], idx1)) v[idx2].push_back(idx1);
    }
    for(int i=0;i<id_list.size();i++)
    {
        if(v[i].size() >= k)
            for(int j=0;j<v[i].size();j++) answer[v[i][j]]++;
    }
    return answer;
}

효율적인 코드

#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;
}

0개의 댓글