#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++도 다음학기에 학교 수업 들으면 좋을 것 같다.
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) ...
}
코드가 훨씬 간결하고 실제 코테에서도 유용하게 사용될거니깐 굿럭!