본문 바로가기

Algorithm/카카오기출

[프로그래머스]신고 결과 받기 / istringstream

문제

 

풀이

#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm> //unique, find
#include <sstream> // istringstream

using namespace std;

vector<int> solution(vector<string> id_list, vector<string> report, int k) {
    string name;
    string report_name;
    int idx = 0;
    vector<vector<string>> user(id_list.size(),vector<string>()); // 계정당 신고한 id
    vector<int> report_count(id_list.size(),0); //신고당한 횟수
    vector<int> answer(id_list.size(),0); 
    vector<string> report_user; // 정지된 유저 id
    
    //중복값 제거
    sort(report.begin(), report.end());
    report.erase(unique(report.begin(),report.end()), report.end());

    for(int i=0; i<report.size(); i++){
        istringstream ss(report[i]);
        ss>>name;
        idx = find(id_list.begin(), id_list.end(), name) - id_list.begin(); // index
        ss>>report_name;
        user[idx].push_back(report_name);
        idx = find(id_list.begin(), id_list.end(), report_name) - id_list.begin(); // index
        report_count[idx]++;
    }
    
    //정지된 아이디
    for(int i=0; i<report_count.size(); i++){
        if(report_count[i] >= k){
            report_user.push_back(id_list[i]);
        }
    }
    
    for(int i=0; i< user.size(); i++){
        for(int j=0; j<report_user.size(); j++){
            if(find(user[i].begin(), user[i].end(),report_user[j]) != user[i].end())
                answer[i] = answer[i] +1;
        }
    }
    
    return answer;
}

변수랑 벡터를 많이 선언해서 코드 가독성이 나쁜 것 같아 이 부분을 해결해 보았다.

 

 

풀이2

#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm> //unique, find
#include <sstream> // istringstream
#include <set>

using namespace std;

vector<int> solution(vector<string> id_list, vector<string> report, int k) {
    string name;
    string name2;
    vector<int> answer(id_list.size(),0); 
    unordered_map<string, set<string>> um; // 신고한사람, 신고당한사람 // set
    unordered_map<string, int> um2; // 신고당한사람, 신고당한횟수
    
    //중복값 제거
    sort(report.begin(), report.end());
    report.erase(unique(report.begin(),report.end()), report.end());
    
    for(int i=0; i<report.size(); i++){
        istringstream ss(report[i]);
        ss >> name;
        ss >> name2;
        um[name].insert(name2);
        um2[name2]++;
    }
    
    for(int i=0; i<id_list.size(); i++){
        name = id_list[i];
        for(auto j : um[name] ){
            if(um2[j] >= k) answer[i]+=1;
        }
    }
    
    return answer;
}

vector대신 해시와 set을 사용했다.

set은 사용해본 적이 많이 없어서 구글링 해가며 풀었다.

범위 기반 for 문을 사용해 반복문을 간단하게 사용할 수 있다는 것을 알게 되었다.

 


https://pythonq.com/so/c%2B%2B/2592

 

c++ - std::vector에 항목이 있는지 확인하는 방법? - IT 툴 넷

c++ - std::vector에 항목이 있는지 확인하는 방법? 기사 출처 c++ vector std

pythonq.com

https://dar0m.tistory.com/77

 

[C++] vector 배열 중복 제거 하는 법

배열 중복을 제거하는 법 vector  v 를 유일한 원소들의 집합으로 만들고 싶다면, 정렬을 한다. : sort 연속된 중복 원소를 vector의 제일 뒷부분(쓰레기 값)으로 보내버린다. : unique 중복된 원소들

dar0m.tistory.com

https://torbjorn.tistory.com/265

 

C++ vector에 존재하는 원소의 인덱스 찾기

std::find 함수를 사용하면 iterator가 반환되는데요, iterator끼리 빼면 거리가 나오는 점을 이용하면 찾고자 하는 값이 몇번째 인덱스에 존재하는지 알 수 있습니다. vector a = { 1,2,3,4 }; cout << std::find..

torbjorn.tistory.com

 

 

 

 

https://boycoding.tistory.com/210

 

C++ 07.18 - 범위 기반 for 문 (range-based for statement)

범위 기반 for 문 (range-based for statement) '06.06 - for 문' 포스트에서 for 문을 사용하여 배열의 각 요소를 반복하는 예제를 봤다. #include int main() { const int numStudents = 5; int..

boycoding.tistory.com

 

 

 

 

<set>

https://modoocode.com/224

 

씹어먹는 C++ - <10 - 2. C++ STL - 셋(set), 맵(map), unordered_set, unordered_map>

 

modoocode.com