문제 설명
제한 사항 및 입출력 예제
개념
id_list에 포함된 사용자가 신고 결과 이메일을 얼마나 많이 받았는지 파악하는 문제다. 각 신고 처리 내역은 "신고자 신고할 사람"의 형식으로 제시된다.
단, 본 문제에서 핵심적인 고려 사항은 동일한 사용자에 대한 중복 신고가 단 한 번의 신고로만 처리된다는 점이다. 따라서, 동일한 대상에 대한 다수의 신고가 있더라도 이를 단일 신고로 간주하며, 이는 신고 결과 이메일의 수를 결정하는 데 중요한 요소가 된다는 점을 놓치면 안 된다.
따라서 map 자료구조를 활용하여 "신고자" "신고한 사람"의 형태의 쌍을 받아 처리할 수 있다. 각 신고자를 키로 설정하고, 신고한 사람을 값으로 설정한다. 동일한 신고자가 동일한 신고한 사람을 여러 번 신고하더라도, map 구조에서는 한 번만 기록되기 때문에, 신고 결과 이메일을 몇 번 받았는지 쉽게 파악할 수 있다.
풀이
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
vector<int> solution(vector<string> id_list, vector<string> report, int k)
{
vector<int> answer;
unordered_map<string, vector<string>> m;
unordered_map<string, int> cnt;
정답 배열 answer, "신고자" "신고한 사람"의 형태를 저장할 map 자료구조 m을 초기화한다. 그리고 추후에 "신고당한 사람" "신고당한 횟수"의 형태를 저장할 map 자료구조 cnt도 초기화해 준다.
for (int i = 0; i < report.size(); ++i)
{
string key, value, tmp;
for (const auto& val : report[i])
{
if (val == ' ')
{
key = tmp;
tmp.clear();
}
else
tmp += val;
}
value = tmp;
신고 내역에는 신고자와 신고한 사람이 공백으로 구분되어 있으므로 공백을 기준으로 key와 value를 지정하였다.
auto found = find(m[key].begin(), m[key].end(), value);
if (found == m[key].end())
{
m[key].push_back(value);
cnt[value]++;
}
}
만약 맵에 value가 존재한다면, 주어진 조건을 만족하기 위해 값을 추가하지 않게 하였다.
for (const auto& val : id_list)
{
int count = 0;
for (const auto& val2 : m[val])
{
if (cnt[val2] >= k)
count++;
}
answer.push_back(count);
}
return answer;
}
id_list에 있는 값을 꺼내서 m과 cnt의 키값으로 써서 주어진 조건을 만족하는지 확인하면 된다.
총합본
더보기
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
vector<int> solution(vector<string> id_list, vector<string> report, int k)
{
vector<int> answer;
unordered_map<string, vector<string>> m;
unordered_map<string, int> cnt;
for (const auto& val : id_list)
m[val];
for (int i = 0; i < report.size(); ++i)
{
string key, value, tmp;
for (const auto& val : report[i])
{
if (val == ' ')
{
key = tmp;
tmp.clear();
}
else
tmp += val;
}
value = tmp;
auto found = find(m[key].begin(), m[key].end(), value);
if (found == m[key].end())
{
m[key].push_back(value);
cnt[value]++;
}
}
for (const auto& val : id_list)
{
int count = 0;
for (const auto& val2 : m[val])
{
if (cnt[val2] >= k)
count++;
}
answer.push_back(count);
}
return answer;
}
반응형
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] JadenCase 문자열 만들기 with C++ (0) | 2023.05.27 |
---|---|
[프로그래머스] 이중우선순위큐 with C++ (0) | 2023.05.26 |
[프로그래머스] n^2 배열 자르기 with C++ (0) | 2023.02.06 |
[프로그래머스] 괄호 회전하기 with C++ (2) | 2023.01.29 |
[프로그래머스] 연속 부분 수열 합의 개수 C++ (0) | 2023.01.16 |