[프로그래머스] 신고 결과 받기 (Lv1/2022 KAKAO BLIND RECRUITMENT)

meong·2023년 4월 12일
0

코테 공부

목록 보기
10/10
post-thumbnail

문제

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


고민 1. Map의 특성과 사용법

문제를 풀려면 다음 데이터들을 저장해야한다.
1. 각 사용자가 신고 당한 횟수
2. 각 사용자가 신고한 사용자 리스트

저장할 데이터를 보면 각 사용자 별로 저장해야한다는 특징이 있다
즉, key-value의 형식으로 key는 각 사용자, value는 차단 당한 횟수 또는 신고한 리스트이다.

key-value의 값을 저장하는 자료 구조는 Map이므로 아래와 같이 정의해준다.

Map<String,Integer> BlockMap = new HashMap<String,Integer>();   // 유저-차단당한 횟수
Map<String, ArrayList<String>> ReportMap = new HashMap<>();     // 유저-차단한 유저리스트

첫 번째 포인트!

Map<String, ArrayList<String>> 와 같이 value 값으로 리스트를 넣을 수 있다!
이걸 몰라서 한참 고민했다.

Map 관련 함수

  • 삽입 : Map.put(key,value)
  • 수정 : Map.replace(key,value) or Map.put(key,value)
    • 데이터가 있는 상태에서 Map.put(key,value)을 하면 해당 key 값이 수정됨(key는 중복될 수 없기 때문)
  • value값 가져오기: Map.get(key)

두 Map의 값을 구하는 로직은 다음과 같다.

  1. report 리스트의 문자열을 사용자와 차단자로 분리하여
String user=r.split(" ")[0];
String block= r.split(" ")[1];
  1. ReportMap에 저장되어있는 해당 사용자의 '차단한 유저 리스트'를 갱신하고
ArrayList<String> list =ReportMap.get(user);
list.add(block);
ReportMap.put(user,list);
  1. 차단 신고가 들어온 유저는 차단 횟수를 증가시킨다.
 BlockMap.put(block , BlockMap.get(block) + 1);

고민2. Map은 순서가 없다!

두 번째 포인트!

Map은 순서가 없는 자료 구조이다

처음에 각 유저별로 신고 처리 메일 개수도 Map에 저장한 후 리스트로 반환하려고 했다.
그런데 Map에 저장하니.. 처음 받은 id_list(유저 리스트)의 순서와 Map의 순서가 달라지게 됐다!
output 형식이 input의 유저 순서와 동일해야 하기 때문에 순서가 없는 Map으로 저장하는 방식은 문제가 있었다.

int[] answer에 처리 메일 개수를 저장하는 방식으로 변경한 후,
각 유저의 차단 리스트를 순회하며 신고한 사용자가 정지 대상이면
answer 배열의 값을 변경하는 식으로 수정했다.

for(int i=0;i<id_list.length;i++){
	// 각 유저의 차단 리스트
    List<String> repList=ReportMap.get(id_list[i]);
            
    for(String user:repList){
    	// 차단한 유저가 이용 정지면 메일 개수 추가
        if(BlockMap.get(user)>=k) answer[i]++;
    }
}

최종코드

GitHub Java-algorithm-practice/프로그래머스/lv1/92334. 신고 결과 받기/

import java.util.*;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        Map<String,Integer> BlockMap = new HashMap<String,Integer>();   // 유저-차단당한 횟수
        Map<String, ArrayList<String>> ReportMap = new HashMap<>();     // 유저-차단한 유저리스트

        // 차단 중복 제거 
        report = Arrays.stream(report).distinct().toArray(String[]::new);

        // Map 초기화
        for(String u:id_list){
            BlockMap.put(u,0);
            ReportMap.put(u,new ArrayList<>());
        }

        for(String r:report){
            String user=r.split(" ")[0];
            String block= r.split(" ")[1];

            // 유저-차단한 유저리스트 갱신
            ArrayList<String> list =ReportMap.get(user);
            list.add(block);
            ReportMap.put(user,list);

            // 차단 횟수 갱신
            BlockMap.put(block , BlockMap.get(block) + 1);
        }

        for(int i=0;i<id_list.length;i++){
            // 각 유저의 차단 리스트
            List<String> repList=ReportMap.get(id_list[i]);
            
            for(String user:repList){
                // 차단한 유저가 이용 정지면 메일 개수 추가
                if(BlockMap.get(user)>=k) answer[i]++;
            }
        }

        return answer;
    }
}
profile
새싹 개발자

0개의 댓글