[Programmers] 신고결과 받기

bin1225·2022년 12월 22일
0

Algorithm

목록 보기
7/43

#include <string>
#include <iostream>
#include <vector>
#include <unordered_map>
#include <sstream>
using namespace std;

vector<int> solution(vector<string> id_list, vector<string> report, int k){
    vector<int> answer(id_list.size());
    unordered_map<string, vector<int>> m;
    
    for(int i=0;i<id_list.size();i++){        
        m[id_list[i]]=vector<int>();
        m[id_list[i]].push_back(i);
        m[id_list[i]].push_back(0);
        
    }
    for(string s:report){
        string first, second;
        stringstream ss(s);
        ss.str(s);
        ss>>first>>second;
        
        int findex= m[first][0]; 
        int tmp=0;
        for(int i=2;i<m[second].size();i++){
            if(m[second][i]==findex)
                tmp=1;
        }
        if(tmp==0){
             m[second][1]++;     //신고당한 횟수 증가

        m[second].push_back(findex);
        }
     
    }
    
    unordered_map<string, vector<int>>::iterator it;
    for(it = m.begin(); it != m.end() ; it++){
        if(it->second[1]>=k){
            for(int i=2; i<it->second.size(); i++){
                answer[it->second[i]]++;
            }
        }
    }
    
    for(int i: answer){
        cout<<i<< " ";
    }
    return answer;
}

Level1치고는 정답률이 33퍼센트인 문제였다.
사실 예전에 한 번 푸려고 했다가 못 풀고 방치해놨었는데, 이번에 다시 시도했다.

뭔가 풀이 방법을 떠올리기가 어려운 문제는 아닌데 어떻게 구현을 해야할지 생각을 했다. 어떤 자료구조를 사용해야 좀 더 깔끔하게 코드를 작성할 수 있을지가 고민이었다.

나는 map 구조를 string, vector로 구분하고 vector에 인덱스마다 필요한 값들을 저장했다.
v[0] -> 본인 인덱스
v[1] -> 신고당한 횟수
그 이후는 자신을 신고한 user의 인덱스를 차례로 삽입해서, 만약 신고당한 횟수가 기준을 넘어갈 때 차례로 읽으면서 메일 횟수를 증가시켜주는 식으로 하였다.

map 에 vector를 넣는 거라던가,
iterator, stringstream 등 나 딴에는 새로운 기능을 시도해본다고 구글링을 많이 했다. c++도 다음학기에 학교 수업 들으면 좋을 것 같다.

2개의 댓글

comment-user-thumbnail
2022년 12월 22일

C++의 유일한 단점이라고 생각하는 건 문자열 다루기야 (빈 문자열 처리, 숫자 문자 나누기) 파이썬은 split() 혹은 join() 으로 되게 유연하게 할 수 있는데 C++ 은 그게 힘들어서 stringstream 으로 커버하는 거지! 근데 stringstream 도 실제 코테에서는 좀 불편해, 그래서 상황마다 다르지만 내 경험상 문자열 처리가 가장 좋았던건 istringstream 인데 이유는 특정 type 으로 바로 문자열을 변환 해주는게 가능하거든! 한번 찾아봐 ㅎㅎ

프로그래머스 - 순위검색 문제 조금 어려운데 문자열을 많이 다뤄서 도전해봐도 좋을거 같구! 링크는 내 블로그에서 풀었던거 :)
https://velog.io/@yssgood/%EC%88%9C%EC%9C%84-%EA%B2%80%EC%83%89

추가적으로 map 루핑할때 iterator 을 직접 선언해주고 포인터처럼 사용하는 거는 진짜 불편하고 힘든 방식이야. 결국 map을 만들때 선언되는 data type 은 pair<datatype,datatype> 개념이거든? iterator 썼던 코드 부분을 auto 라는 굉장히 편리한 c++ 데이터타입을 사용해서 다시 써봐

for(auto it : m){
if(it.second[1] >= k) ...
}

코드가 훨씬 간결하고 실제 코테에서도 유용하게 사용될거니깐 굿럭!

1개의 답글