본문 바로가기
휴지통/알고리즘 & 자료구조

신고 결과 받기 [Java]

by 신재권 2022. 3. 8.
import java.io.*;
import java.util.*;

class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {

        int user_len = id_list.length; //id 개수 
        int report_len = report.length; // 처리해야할 신고 수 
        StringTokenizer st;
        boolean[][] check = new boolean[user_len][user_len]; // check 2차원배열 
        
        for(int i=0; i<report_len; i++){
            st = new StringTokenizer(report[i]);
            int sinGoza = find_user(id_list, st.nextToken()); //신고자 idx 
            int sinGoDang = find_user(id_list, st.nextToken()); //신고당한사람 idx
            check[sinGoza][sinGoDang] = true; //1번만 신고되므로 boolean으로 체크 
        }
        
        int[] singo_cnt = new int[user_len];
        int[] answer = new int[user_len];
        
        //신고당한 횟수를 세줌 
        for(int i=0; i<user_len; i++){
            for(int j=0; j<user_len; j++){
                if(check[i][j]) singo_cnt[j]++;
            }
        }
        
        //정지 기준 k를 넘긴 유저를 신고한 사람에게 결과를 알려줘야함 
        for(int i=0; i<user_len; i++){
            if(singo_cnt[i] >= k){
                for(int j=0; j<user_len; j++){
                    if(check[j][i]){
                        answer[j]++;
                    }
                }
            }
        }
        

        return answer;
    }
    
    
    //user의 idx값을 반환하는 함수
    public static int find_user(String[] id_list, String username){
        for(int i=0; i<id_list.length; i++){
            if(id_list[i].equals(username)) return i;
        }
        return -1;
    }
}

2차원 배열로 풀이를 한 그림 

id_list의 길이 : 1,000 

시간복잡도 : 

1000 x 1000  = 2중 for문 사용 

O(N^2) 

-> 해쉬맵, Set으로도 풀이 가능 

'휴지통 > 알고리즘 & 자료구조' 카테고리의 다른 글

백준 18108  (0) 2022.03.10
신규 아이디 추천[Java]  (0) 2022.03.09
백준 2231  (0) 2022.03.07
문제해결전략 : BOGGLE (Java)  (0) 2022.03.06
백준 1189  (0) 2022.03.05