PS/Programmers

[level1, Map] 신고 결과 받기

git-sun 2023. 3. 16. 14:27

1. 문제

 

 

 

 

 

2. 문제 해결 논리 

  1. 문제 이해
    • 주어진 것
      • String[] id_list    //유저 Id 배열
      • String[] report    //신고 정보(신고자, 피 신고자) 배열
      • int k                   // 정지 기준 신고 횟수
    • 요구되는 것
      • int[]                    //각 유저 별 신고 처리 메일 발송 횟수 배열
  2. 데이터 구조 결정
    • Map 구조 사용
      1. 키-값 저장 : 각 유저 별(Key) 유저 정보(Value, 피 신고 횟수 or 신고자 목록) -> Map 사용
      2. 빠른 조회 속도 : HashMap(해시 함수 이용) -> 조회 속도 빠름
      3. 유연한 사이즈 : Map은 동적으로 크기 조절 가능 -> 유저의 수가 변동될 때에도 구조 유지 가능  
  3. 알고리즘 설계
    • 각 유저 별 유저 정보를 위한 Map 생성
      • 각 유저 Id와 인덱스를 저장할 Map1 생성
      • 피 신고자와 신고자 목록을 저장할 Map2 생성
      • 피 신고자와 피 신고 횟수를 저장할 Map3 생성
    • 유저 목록(배열 id_list)을 활용하여 Map1 초기화
    • 신고 정보(배열 report)를 활용하여 Map2, Map3 초기화
    •  Map2와 Map3를 활용
      • k번 이상 신고된 Id를 찾아서 정지 처리 결과 메일 발송 횟수를 배열에 저장
    •  결과 배열 반환

 

 

 

 

 

3. 코드 구현

import java.util.*;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        int n = id_list.length;
        int[] answer = new int[n];
        Map<String, Integer> userIndex = new HashMap<>();       //유저 목록
        Map<String, Set<String>> reportedss = new HashMap<>();  //피 신고자와 신고자
        Map<String, Integer> reportCount = new HashMap<>();     //피 신고자와 피 신고 횟수
        
        //유저 목록 Map으로 생성
        for (int i = 0; i < n; i++) {
            userIndex.put(id_list[i], i);
        }
        
        //신고 정보 Map(reportedss, reportCount)으로 기록
        for (String rep : report) {
            String[] users = rep.split(" ");
            String reporter = users[0];
            String reported = users[1];
            
            //피 신고자가 처음 신고된다면 HashSet 생성
            if (!reportedss.containsKey(reported)) {
                reportedss.put(reported, new HashSet<>());
            }
            //피 신고자가 신고된다면(동일 신고자 중복 신고 횟수 제거 포함) 신고 횟수 추가
            if (reportedss.get(reported).add(reporter)) {
                reportCount.put(reported, reportCount.getOrDefault(reported, 0) + 1);
            }
        }
        
        //피 신고자의 피 신고 횟수가 k이상이라면(=게시판 이용 정지 처리됐다면)
        //Set으로 신고자 목록 생성
        for (String key : reportCount.keySet()) {
            if (reportCount.get(key) >= k) {
                //신고자 목록의 각 신고자마다 처리 메일 발송 횟수를 answer 배열에 저장
                Set<String> repUsers = reportedss.get(key);
                for (String reporter : repUsers) {
                    int idx = userIndex.get(reporter);
                    answer[idx]++;
                }
            }
        }
        
        return answer;
    }
}

 

 

 

 

 

 

 

* Reference

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형