https://programmers.co.kr/learn/courses/30/lessons/92334

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

 

 

문제 분석

- 신고한 유저와 신고당한 유저를 HashMap으로 관리한다.

    -> reportMap : 신고당한 유저 관리

        신고한 유저(String) - 신고한 유저들 목록(Set) *중복을 제거하기 위해 Set활용

    -> reportedMap : 신고당한 유저관리

        신고당한 유저(String) - 신고당한 횟수(Integer)

- for문을 통해 각 HashMap들을 초기화한다.

- report의 개수만큼 신고한 사람에게 중복되지 않게 추가할 수 있다면 신고한 유저를 관리하는 Map에 추가하고 신고당한 유저를 관리하는 Map에 신고 횟수를 추가한다.

 

 

문제 풀이

1. for문을 통해 각각의 Map을 초기화해준다.

2. 입력받은 report의 길이만큼 for문을 반복하여 신고한 유저를 해당 HashMap에 add해준다. (if문을 통해 중복되어 들어갔는지 확인한다. add의 경우 리턴 타입이 true || false이기 때문에 중복되지않고 잘 들어간 케이스만 신고 횟수를 증가시킨다)

3. for문을 통해 신고당한 횟수가 k번 이상인 경우를 체크하고 만약 k번 미만인 경우 신고한 유저의 HashMap에서 신고한 유저 리스트를 remove메소드를 통해 지워버린다.

4. for문을 통해 신고한 유저가 가지고 있는 크기만큼을 정답 배열에 넣어준다.

import java.util.*;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        
        StringTokenizer st;
        
        Map<String, Set<String>> reportMap = new HashMap<>(); // 신고한 유저 관리 - (신고한 유저, 신고한 유저들)
        Map<String, Integer> reportedMap= new HashMap<>(); // 신고당한 유저 관리 - (신고당한 유저, 신고당한 횟수)
        
        for(int i=0;i<id_list.length;i++){
            reportMap.put(id_list[i], new HashSet<>());
            reportedMap.put(id_list[i], 0);
        }
        
        for(int i=0;i<report.length;i++){
            st = new StringTokenizer(report[i]);
            String from = st.nextToken(); // 신고한 사람
            String to = st.nextToken(); // 신고당한 사람
            if(reportMap.get(from).add(to)){ // add는 리턴타입이 true || false
                reportedMap.put(to, reportedMap.get(to)+1);
            }
        }
        
        // 신고당한 횟수가 k회 이상인 경우만 체크
       for(int i=0;i<report.length;i++){
        	st = new StringTokenizer(report[i]);
            String from = st.nextToken(); // 신고한 사람
            String to = st.nextToken(); // 신고당한 사람
            if(reportedMap.get(to) < k) {
            	reportMap.get(from).remove(to);
            }
        }
        
        for(int i=0;i<id_list.length;i++) {
        	answer[i] = reportMap.get(id_list[i]).size();
        }
        
        return answer;
    }
}

 

 

https://github.com/SOEUN2/Algorithm