2022. 6. 27. 17:51ㆍ개발자 과정/C,C++
이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report(이용자+신고한 id), 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.
라고 대충 이해하면 되는 문제이다. 처음에는 2차원 배열을 동적으로 만들고 배열의 index값을 id_list의 이용자 순서로 추상적 정의를 한 다음 한 이용자가 같은 이용자를 신고했을 때 기록되는 횟수는 1번만 기록되기에 0과 1로된 id_list.sizt()*id_liszt.size()시트에 기록하려고 했다. 그 다음 중첩 for문을 돌면서 i와 j를 바꿔 집어 넣어 연산했을 때 k값 이상이 되면 answer에 기록하도록 만들었는데, 이렇게 풀려고 하니 값 하나하나가 굉장히 신중하고 섬세해야 하며, 추상적으로 정의된 2차원 배열을 또 다시 추상적으로 뒤집어 가며 중첩계산해야 하는 코드는 level1이라고 절대 생각이 안될거 같아서 테스트 케이스까지만 통과하고 코드를 전부 날려버리고 문자열 함수와 STL에 대해 찾아 다녔다.
결론으로 이 문제는 STL이 가진 기능과 문자열 다루는 함수를 잘 알고 있으면 쉬운 문제였으나, 나 처럼 그에 대해 잘 몰라서 무식하게 때려넣으면 난이도가 수직으로 상승하는 문제라고 말하면 될 것 같다. 이제 풀이를 보자.
vector<int> solution(vector<string> id_list, vector<string> report, int k) {
vector<int> answer(id_list.size());
unordered_map <string, unordered_set<string>> reportmap;
unordered_map <string, unordered_set<string>> resultmap;
//unordered는 처음 보는 이름이었다. map이 가진 내부적으로
정렬하는 기능을 빼는 것이라고 한다.//
for (string r : report) {
//c++에서 이런 for문이 가능 한지 몰랐다.
와! 파이썬 아시는 구나!//
size_t pos = r.find(' ');
string front = r.substr(0, pos);
string back = r.substr(pos + 1);
//space문자를 기준으로 report문자열을 나눈다.//
reportmap[front].insert(back);
resultmap[back].insert(front);
//그리고 repotmap과 resultmap에 더한다.//
중복되는 신고는 map에서 내부적으로 그냥 덮어쓰기에
그 부분은 신경쓰지 않아도 된다.//
}
for (int i = 0; i < id_list.size(); i++) {
string user = id_list.at(i);
//for문으로 id_list의 원소를 받는다.//
auto it = reportmap.find(user);
//reportmap에 user가 있는지 찾아보고 it를 리턴한다.//
if (it == reportmap.end()) {//user가 없으면//
continue;//continue//
}
else {//있으면//
for (string bad : it->second) {//신고받은 유저를 받아온다//
if (resultmap[bad].size() >= k) {
//신고받은 유저map의 value.size()값이 k번 이상이면//
answer[i]++;//answer에 기록한다.//
}
}
}
}
return answer;
}
코딩테스트 문제를 풀면서 느끼는 것은 언어가 가진 기능을 잘 알지 못하면 난이도가 많이 올라간다는 것이다.
문제가 안풀려서 구글링을 하고 찾아보며 새로운 기능을 익힐 수 있으니, 오히려 이게 좋은 공부 방법이 되는 것 같다.
물론, 그동안 그렇게 고생하면서 구현한 나는 뭔가 하는 현타는 덤이다.
'개발자 과정 > C,C++' 카테고리의 다른 글
(코딩테스트)신규아이디 추천 (0) | 2022.06.30 |
---|---|
(코딩테스트)로또의 최고순위와 최저순위 (0) | 2022.06.29 |
(코딩테스트)문자열 압축 (0) | 2022.06.21 |
(코딩테스트)숫자 문자열과 영단어 (0) | 2022.06.18 |
(Tree)이진트리를 좌우로 대칭 시키는 함수 (0) | 2022.06.17 |