[프로그래머스] 신고 결과 받기

fsm12·2023년 7월 14일
0

프로그래머스

목록 보기
36/57
post-thumbnail

문제링크

문제 이해

[ 입력형태 / 조건 ]

id_list
이용자의 ID가 담긴 문자열 배열 | ["muzi", "frodo", "apeach", "neo"] | 2 ≤ id_list의 길이 ≤ 1,000, 1 ≤ id_list의 원소 길이 ≤ 10, id_list의 원소는 이용자의 id를 나타내는 문자열이며 알파벳 소문자로만 이루어져 있고 id_list에는 같은 아이디가 중복해서 들어있지 않음

report
각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 | ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"] | ≤ report의 길이 ≤ 200,000, 3 ≤ report의 원소 길이 ≤ 21

k
정지 기준이 되는 신고 횟수 | 2 | 1 ≤ k ≤ 200, k는 자연수

[ 문제 ]

각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return

[ 풀이 ]

Map에 신고한 사람 : (Set)신고당한사람 으로 저장한 뒤, 신고를 k이상 받은 사람을 신고한 사람의 cnt 증가



코드

> [실패] 1차 시도 : 구현

  • 생각한 풀이 그대로 구현
import java.util.*;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        
        int N = id_list.length;
        Map<String, Integer> order = new HashMap<>();
        for(int n=0; n<N; n++){
            order.put(id_list[n], n);
        }
        
        Map<String, Set<String>> report_res = new HashMap<>();
        int[] cnt = new int[N];
        
        for(String rep : report){
            StringTokenizer st = new StringTokenizer(rep);
            String user_a = st.nextToken();
            String user_b = st.nextToken();
            if(report_res.containsKey(user_a)){
                Set<String> a_report = report_res.get(user_a);
                if(a_report.contains(user_b))
                    continue;
                a_report.add(user_b);
            }else{
                Set<String> set = new HashSet<>();
                set.add(user_b);
                report_res.put(user_a, set);
            }
            cnt[order.get(user_b)] += 1;
        }
        
        int[] ans = new int[N];
        int point = 0;
        for(Set<String> set : report_res.values()){
            for(String val : set){
                int idx = order.get(val);
                if(k <= cnt[idx]){
                    ans[point]+=1;
                }
            }
            point+=1;
        }
        
        return ans;
    }
}



> [성공] 2차 시도 : 구현

  • map.values()가 순서대로 가져오지 않는다는 것을 알게되어 수정함
import java.util.*;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        
        int N = id_list.length;
        Map<String, Integer> order = new HashMap<>();
        for(int n=0; n<N; n++){
            order.put(id_list[n], n);
        }
        
        Map<String, Set<String>> report_res = new LinkedHashMap<>();
        int[] cnt = new int[N];
        
        for(String rep : report){
            StringTokenizer st = new StringTokenizer(rep);
            String user_a = st.nextToken();
            String user_b = st.nextToken();
            
            if(report_res.containsKey(user_a)){
                if(report_res.get(user_a).contains(user_b))
                    continue;
                report_res.get(user_a).add(user_b);
            }else{
                Set<String> set = new LinkedHashSet<>();
                set.add(user_b);
                report_res.put(user_a, set);
            }
            cnt[order.get(user_b)] += 1;
        }
        
        int[] ans = new int[N];
        int point = 0;
        for(String id : id_list){
            for(String val : report_res.getOrDefault(id, new HashSet<>())){
                int idx = order.get(val);
                if(k <= cnt[idx]){
                    ans[point]+=1;
                }
            }
            point+=1;
        }
        
        return ans;
    }
}



Tip : Java에서 Map의 메소드 중 하나인 values()는 순서를 보장해서 가져오지 않으므로 주의해야 한다.

0개의 댓글