늘 겸손하게

Programmers - 2022 KAKAO BLIND RECRUITMENT - 신고 결과 받기 본문

코딩 문제/Programmers

Programmers - 2022 KAKAO BLIND RECRUITMENT - 신고 결과 받기

besforyou999 2022. 3. 1. 20:32

 

안녕하세요 besforyou입니다

 

이번 글은 2022 카카오 블라인드 채용 - 신고 결과 받기 문제 입니다

 


문제 풀이

 

순서대로 설명하겠습니다.

 

1. id_list 속 이름으로 자료구조들 초기화

 

2. report를 순차적으로 읽으며 특정 유저를 신고한 사람을 누적해서 저장합니다.

 

3. 다시 id_list를 순차적으로 돌며 K번 이상 신고당한 유저를 찾습니다.

 

4. 신고당한 유저를 신고한 사람들이 받아야 하는 메일의 개수를 셉니다.

 

 

코드

 

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
55
56
57
58
59
60
61
62
63
64
65
import java.util.HashMap;
import java.util.HashSet;
import java.util.ArrayList;
 
class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
 
        HashMap<String, HashSet> reports = new HashMap<>();         // key : 신고 당한 사람, value : 신고한 사람들
        HashMap<String, Integer> reportedCount = new HashMap<>();   // key : 신고 당한 사람, value : 신고 당한 횟수
        HashMap<String, Integer> mailCount = new HashMap<>();       // key : 유저 이름, value : 받아야할 메일 개수
        ArrayList<String> bannedUser = new ArrayList<>();           // 밴 당할 유저 이름들
 
        // id_list속의 아이디로 자료구조 초기화  : O(N)
        for (int i = 0 ; i < id_list.length ; i++) {
            String id = id_list[i];
            reports.put(id, new HashSet<>());
            reportedCount.put(id, 0);
            mailCount.put(id, 0);
        }
 
        // report 리스트를 순차적으로 읽기 : O(NlogN)
        for (int i = 0 ; i < report.length ; i++) {
            String str[] = report[i].split(" ");
            String reporter = str[0];
            String reported = str[1];
 
            // 신고한 사람이 없다면
            if (!reports.get(reported).contains(reporter)) {
                // 신고한 사람을 hashSet에 삽입
                reports.get(reported).add(reporter);
                // 신고받은 횟수 누적시키기
                int count = reportedCount.get(reported);
                reportedCount.put(reported, count + 1);
            }
        }
 
        // 다시 id_list를 순차적으로 돌며 K번 이상 신고당한 유저 찾기 : O(N)
        for (int i = 0 ; i < id_list.length ; i++) {
            String name = id_list[i];
            int num = reportedCount.get(name);
            if ( num < k ) continue;
 
            bannedUser.add(name); // k번 이상 신고당한 사람 모으기
        }
 
        // O(N * N)
        for (int i = 0 ; i < bannedUser.size() ; i++) {
            String user = bannedUser.get(i);
            HashSet<String> reporters = reports.get(user);  // 해당 유저를 신고한 사람들 집합
            for (String reporter : reporters) { // 집합 순차 탐색
                int count = mailCount.get(reporter);
                mailCount.put(reporter, count + 1);
            }
        }
 
        // 다시 순차적으로 돌며 정답 배열 생성
        for (int i = 0 ; i < id_list.length ; i++) {
            String name = id_list[i];
            answer[i] = mailCount.get(name);
        }
 
        return answer;
    }
}
cs

 

 

결과