📄 문제
신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
- 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
- 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
- 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
- k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
- 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
📝 풀이
#include <string>
#include <vector>
#include <sstream>
#include <unordered_map>
using namespace std;
vector<string> split(string input, char delimiter) {
vector<string> result; // 결과를 리턴할 string 벡터
stringstream ss(input); // sstream
string token; // split된 문자열을 임시로 담을 토큰
// getline 함수로 받아온 후 벡터에 삽입
while (getline(ss, token, delimiter))
result.push_back(token);
return result;
};
vector<int> solution(vector<string> id_list, vector<string> report, int k) {
unordered_map<string, vector<string>> m1; // 대상을 신고한 사람들을 누적으로 담음
unordered_map<string, bool> m2; // 신고자 -> 대상 조합이 이미 사용되었는지 검사 (중복 신고 배제)
unordered_map<string, int> m3; // answer의 인덱스에 바로 접근하기위해 사용
for(string s : id_list)
m1[s];
for(int i = 0; i < id_list.size(); ++i)
m3[id_list[i]] = i;
for(string s : report)
{
vector<string> splited = split(s, ' ');
string from = splited[0];
string to = splited[1];
if(m2[s] == false) // from to 조합이 없는경우
{
m2[s] = true;
m1[to].push_back(from); // m1[to]에 신고자 목록 추가
}
}
vector<int> answer = vector<int>(id_list.size(), 0);
for(pair<string, vector<string>> p : m1)
if(p.second.size() >= k) // 대상이 정지 기준에 부합하는경우?
for(string s : p.second)
++answer[m3[s]]; // p.first를 신고한 대상 1씩 증가
return answer;
}
- map 3개를 이용하여 문제를 해결하였습니다.
- m1은 string 벡터를 담는 구조로, 대상을 신고한 사람을 누적으로 담기 위해 사용합니다.
- m2는 report의 중복을 검사하기 위해 사용합니다. 이 문제에서는 한 사람이 특정 사람을 여러번 신고하는것이 불가능합니다.
- m3는 id_list의 인덱스 번호에 바로 접근하기 위해 사용합니다.
- 모든 신고 문자열 세트를 검사하여 신고자 -> 신고를 당하는 자에 대한 조합을 확인하고, 첫 신고라면 신고를 당하는 사람에 대한 신고 횟수를 vector에 삽입하여 1회씩 누적합니다.
- 모든 사람들을 검사하여 누적 신고가 k 이상이라면, 벡터 내부에서 신고를 한 이름을 기반으로 answer의 값을 1씩 증가시킵니다.
'algorithms (C++)' 카테고리의 다른 글
[C++][프로그래머스] 신규 아이디 추천 (0) | 2023.10.25 |
---|---|
[C++][프로그래머스] 없는 숫자 더하기 (0) | 2023.10.25 |
[C++][프로그래머스] 성격 유형 검사하기 (1) | 2023.10.24 |
[C++][프로그래머스] 숫자 짝꿍 (0) | 2023.10.23 |
[C++][프로그래머스] 삼총사(3개의 순열 뽑기) 🔥 (0) | 2023.10.23 |