프로그래머스의 신고 결과 받기(Lv1) 문제이다.

 

[ 문제풀이 ]

프로그래머스의 신고 결과 받기 문제이다. 문제에 접근하는 과정부터 정답을 도출하는 과정까지 순차적으로 이야기해보자.

 

#1. 변수 및 정보 관리

이 문제에서 주어진 정보들에 대해서 이야기를 해보자.

#1 - 1) User ID 관리

유저들의 ID가 주어지고, (유저 , 해당 유저가 신고한 아이디) 의 형태로 정보가 주어진다.

첫 번째로  본인은 string 형태로 이루어진 유저들의 ID를 간편하게 int형으로 관리를 해주기 위해서 자료구조 map을 사용해 주었다. map을 이용해서 유저들의 ID를 1부터 순차적으로 번호를 붙여서 간단하게 관리를 해 주었다.

 

#1 - 2) 신고 정보

두 번째로 우리는 어떤 사용자가 누구를 신고했는지를 저장을 해줘야 한다. 이 정보를 저장하고 있어야만 정답을 도출할 수 있기 때문이다. 그래서 이를 저장하기 위해서 vector배열을 하나 선언해 주었다.

vector배열로 선언해준 이유는, 한 명이 여러명을 신고할 수 있는데, 이 여러명을 관리해주기 위해서 vector를 사용해 주었고, 배열이 붙은 이유는 단순히 신고한 사용자를 표시해 주기 위해서 선언해 주었다.

예를 들어서, #1 - 1) 과정에서 'muzi' 라는 사용자를 '1'번으로 설정을 했다고 가정해보자. 그리고 'muzi'가 'frodo'를 신고하게 되면, vector[1] = { 'frodo' } 이런식으로 들어가도록, 사용자 ID를 int형으로 바꾼 값을 Index로 사용하기 위해서 vector배열로 선언해 주었다.

이를 통해서, 누가 누구를 신고했는지를 vector배열을 통해서 저장해 주었다.

 

#1 - 3) 신고 당한 유저 정보

#1 - 2)에서 이야기한 정보를 저장할 때, 신고 당한 유저들 중에서, k번 이상 신고를 당해서 이용 정지를 당하는 유저를 찾아줘야 한다. 그러기 위해서 2가지 변수를 더 사용해 주었다.

첫 번째 변수는 "유저가 신고당하는 횟수를 저장하는 변수" 이고, 두 번째 변수는 "k번 이상 신고당해서 이용 정지를 당한 유저를 저장하는 변수" 이다.

먼저, "유저가 신고당하는 횟수를 저장하는 변수"를 map을 이용해서 저장해 주었다. map<string, int> 형태로 선언을 해서 <신고당한 유저의 아이디 , 신고당한 횟수 > 의 형태로 데이터를 저장해 주었다.

그리고, 위와 같은 형태로 데이터를 저장할 때, 신고당한 횟수와 k값을 비교해서 k번 이상 신고를 당했다면 이용 정지를 당한 유저의 목록에 저장해 주었다. 이용 정지를 당한 유저의 경우에는 단순히 string을 자료형으로 갖는 vector를 이용해서 저장해 주었다.

 

위의 모든 내용을 코드로 나타내면 다음과 같다. 아래의 코드는 우리에게 주어지는 매개변수 'report'를 통해서

1. 각각의 userID를 int형으로 mapping 시키는 과정

2. (신고한 사람 , 신고 당한 사람) 을 저장하는 과정

3. 신고 당한 사람 중, K번 이상 신고 당한 사람을 저장하는 과정을 나타낸다.

map<string, int> mapping; 		// USER_ID를 int형으로 mapping시킨 후 저장하기 위한 변수
map<string, int> reportCount;	// 신고 당한 횟수를 저장하기 위한 변수
vector<string> reportList[1010];	// 누가 누구를 신고했는지 저장하기 위한 변수
vector<string> blacklist;			// k번 이상 신고를 당한 user만 저장하기 위한 변수

void countReport(vector<string> report, int k) {
	int num = 1;
	for (int i = 0; i < report.size(); i++) {
		string str = report[i];
		stringstream streamStr(str);
		string userID, blacklistID;
		streamStr >> userID >> blacklistID;

		/* 
        	mapping[ID]==0 이라는 것은 아직 이 user는 int형으로 mapping 되지 않았음을 의미
        */
		if (mapping[userID] == 0) mapping[userID] = num++;	
		if (mapping[blacklistID] == 0) mapping[blacklistID] = num++;
		if (find(reportList[mapping[userID]].begin(), reportList[mapping[userID]].end(), blacklistID) == reportList[mapping[userID]].end()) {
			reportList[mapping[userID]].push_back(blacklistID);
			reportCount[blacklistID]++;
			if (reportCount[blacklistID] >= k) {
				blacklist.push_back(blacklistID);
			}
		}
	}
}

 

#2. 정답 도출

위에서 정리한 자료들을 토대로 정답을 도출해보자.

우리가 구해야 하는 것은, 각각의 USER가 받은 결과 메일 수를 구해야 하는 것인데, 이 결과 메일 수 라는 것은 "해당 유저가 신고한 사람들 중, k번 이상 신고를 당해서 이용 정지를 당한 사람의 수" 를 의미한다.

우리는 이를 위해서, #1의 과정에서 "누가 누구를 신고했는지"도 저장해 놓았고, "k번 이상 신고 당해서 이용 정지를 당한 유저의 리스트"도 저장을 해 놓았다.

이제는, userID를 순차적으로 탐색을 하면서, 해당 user가 신고한 사람 중에서 이용 정지를 당한 사람만 찾아서 그 수를 Count 해주면 된다. 코드로 나타내면 다음과 같다.

vector<int> findAnswer(vector<string> id_list) {
	vector<int> answer;
	for (auto userID : id_list) {
		int mappingID = mapping[userID];
		int result = 0;
		for (auto reportID : reportList[mappingID]) {
			if (find(blacklist.begin(), blacklist.end(), reportID) != blacklist.end()) {
				result++;
			}
		}
		answer.push_back(result);
	}
	return answer;
}

 

[ 소스코드 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <map>
 
using namespace std;
 
map<stringint> mapping;
map<stringint> reportCount;
vector<string> reportList[1010];
vector<string> blacklist;
 
void countReport(vector<string> report, int k) {
    int num = 1;
    for (int i = 0; i < report.size(); i++) {
        string str = report[i];
        stringstream streamStr(str);
        string userID, blacklistID;
        streamStr >> userID >> blacklistID;
 
        if (mapping[userID] == 0) mapping[userID] = num++;
        if (mapping[blacklistID] == 0) mapping[blacklistID] = num++;
        if (find(reportList[mapping[userID]].begin(), reportList[mapping[userID]].end(), blacklistID) == reportList[mapping[userID]].end()) {
            reportList[mapping[userID]].push_back(blacklistID);
            reportCount[blacklistID]++;
            if (reportCount[blacklistID] >= k) {
                blacklist.push_back(blacklistID);
            }
        }
    }
}
 
vector<int> findAnswer(vector<string> id_list) {
    vector<int> answer;
    for (auto userID : id_list) {
        int mappingID = mapping[userID];
        int result = 0;
        for (auto reportID : reportList[mappingID]) {
            if (find(blacklist.begin(), blacklist.end(), reportID) != blacklist.end()) {
                result++;
            }
        }
        answer.push_back(result);
    }
    return answer;
}
 
vector<int> solution(vector<string> id_list, vector<string> report, int k) {
    vector<int> answer;
    countReport(report, k);
    answer = findAnswer(id_list);
    return answer;
}
cs

 

 

+ Recent posts