본문 바로가기

CodingTest Practice

[programmers] 신고 결과 받기

programmers - 신고 결과 받기

k번 이상 신고된 유저는 게시판 이용이 정지, 해당 유저를 신고한 모든 유저에게 정지 사실을 이메일로 발송

각 유저가 발송받은 이메일의 수를 반환

 

■ 문제 풀이

1) 문풀 설명
- 이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 K
- 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return

2) 예제
id_list report k result
["muzi", "frodo", "apeach", "neo"] ["muzi frodo", "apeach frodo", "frodo neo", "muzi neo", "apeach muzi"] 2 [2,1,1,0]
["con", "ryan"] "ryan con", "ryan con", "ryan con", "ryan con"] 3 [0,0]
첫번째 행의 예제를 살펴보면,
전체 유저 목록은 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고를 당하면 이용 정지)인 경우의 예시
report 열을 보시면,
"muzi frodo"는 muzi는 frodo를 신고 하였다는 의미
- frodo를 신고한 유저는 muzi, apeach 
- neo를 신고한 유저는 frodo, muzi
- muzi를 신고한 유저는 apeach 

k의 값을 2로 설정할 경우, 2번 이상 신고를 당한 유저는 게시판을 사용할 수 없게 된다. 
그러므로 frodo와 neo는 게시판을 사용할 수 없다. 
유저 muzi는 frodo와 neo를 신고했으므로 2번의 신고 결과 이메일을 받게 된다. 
유저 frodo는 neo를 신고했으므로 1번의 신고 결과 이메일을 받게 된다.
유저 apeach는 muzi와 frodo를 신고했지만 frodo만이 게시물 사용 정지가 되었으므로 신고 결과 이메일을 1번만 받게 된다.
유저 neosms 아무도 신고하지 않았으므로 신고 결과 이메일을 받지 않는다.

3) 힌트
HashSet을 이용하여 문제를 해결 / 해시 자료구조를 활용하여 문제를 해결
report 배열에 저장된 데이터를 하나씩 처리
[신고된 유저 아이디 1] : [신고한 유저 A, 신고한 유저 B]

- 한 유저가 같은 유저를 여러 번 신고한 경우 신고 횟수를 1로 처리
- 신고 횟수에는 제한이 없음, 서로 다른 유저를 계속해서 신고 가능

[solution 1]

import java.util.*;

public class Report {

    static int[] solution(String[] id_list, String[] report, int k) {
        int[] result = new int[id_list.length];
        Map<String, HashSet<String>> map = new HashMap<>();
        Map<String, Integer> count = new HashMap<>();

        for (int i = 0; i < id_list.length; i++) {
            count.put(id_list[i], 0);
            map.put(id_list[i], new HashSet<String>());
        }

        for (int i = 0; i < report.length; i++) {
            String[] split = report[i].split(" ");
            String userId = split[0];
            String reportedId = split[1];

            map.get(reportedId).add(userId);
        }

        for (String key : map.keySet()) {
            HashSet<String> reporter = map.get(key);
            if (reporter.size() >= k) {
                for (String id : reporter) {
                    count.put(id, count.get(id) + 1);
                }
            }
        }

        for (int i = 0; i < id_list.length; i++) {
            result[i] = count.get(id_list[i]);
        }

        return result;
    }

    public static void main(String[] args) {
        String[] id_list = {"muzi", "frodo", "apeach", "neo"};
        String[] report = {"muzi frodo", "apeach frodo", "frodo neo", "muzi neo", "apeach muzi"};
        int k = 2;

        System.out.println("신고 결과 : " + Arrays.toString(solution(id_list, report, k)));
    }
}