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

Updated:

Categories:

Tags: ,

📌 개인적인 공간으로 공부를 기록하고 복습하기 위해 사용하는 블로그입니다.
정확하지 않은 정보가 있을 수 있으니 참고바랍니다 :😸
[틀린 내용은 댓글로 남겨주시면 복받으실거에요]

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

오늘의 문제는 현재 기준으로 정답률 39%이고, 카카오 2022년 블라인드 채용시 코딩테스트 문제이다

풀어보기🔗

자료구조 Hash 문제 인 걸 선별해서 푸는 중인데 Lv1 이라서 좋아했다가, 정답률 보고 실망했다😀

  1. HashMap 선언

    1
    2
    3
    4
    5
    
       //신고자 id >  신고 당한 사람 id
       Map<String, Set<String>> reports = new HashMap<>();
                
       //신고당한사람, 신고당한 횟수- n번
       Map<String, Integer> count = new HashMap<>();
    
    • 신고한 사람과 신고 당한 사람을 reports(HashMap 변수)에 담고
    • 신고당한 사람과 신고 횟수를 count(HashMap 변수) 에 담았다.
    • 여기서 신고자는 신고를 여러 번 할 수는 있어도 한 사람을 여러 번 할 경우 한 번만 기록되기 때문에 Set 을 사용했다.
  2. for 문 돌려서 Map에 담아주기~

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
             for(int i = 0 ; i < report.length ; i++ ) {
                 String[] arr = report[i].split(" ");
                    
                 Set<String> list = reports.getOrDefault(arr[0], new HashSet<>());
                 boolean b = list.add(arr[1]);
                 reports.put(arr[0], list);
                    
                 if(b) {
                     count.put(arr[1], count.getOrDefault(arr[1], 0) + 1);
                 }
             }
    
    • split으로 공백을 끊어서, 신고자(arr[0])와 피신고자(arr[1])를 배열에 담아준다.
    • reports(HashMap 변수) 에는 안에 또 Set이 있기 때문에 key(신고자, arr[0])로 value를 조회하여 기존 Set을 꺼낸다, 만약 기존 신고 내역이 없으면 새로운 HashSet을 할당해준다.
    • Set에 담을 때 아이디 중복 안돼서 한 개의 아이디만 들어가지만 , 무지가 프로도한테 여러번 신고 할 경우에 count(HashMap 변수) 에는 그 횟수만큼 들어가게 된다.
      • 그래서 Set에 add에 성공하면 true, false를 반환하기 때문에 이를 활용해서 true일 때 count에 담도록 변경했다.
      • 첫 번째 테스트 케이스는 통과했는데 두 번째에서 통과 안되면 여기 수정하면 통과한다~@!
  3. 결과 반환하기

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
      	 			//결과 담을 배열
             int[] answer = new int[id_list.length];
                
             for(int i = 0; i < id_list.length; i++) {
        
                 //신고한 유저 중 정지된 id 구하기 - 신고한 사람들을 가져온 다음 신고 횟수가 k(정지 기준)이상이면 피신고자는 정지되었다 >> + 1          
                 Set<String> list = reports.get(id_list[i]);
                 if(list != null) {
                     for(String s : list) {
                         if(count.get(s) >= k) answer[i]++;
                     }
                 } 
             }
    
    • for(String s : list) 여기서 자꾸 NPE 발생해서 if(list != null) 조건식 추가해주었다
    • 2번에서 reports.getOrDefault(arr[0], new HashSet<>()); 이렇게 할당해주었기 때문에 NULL이 발생할 리가 없을 거라고 생각했는데, 다시 생각해보니 신고한 적이 없는 회원은 당연히 NULL이 나올 수 밖에 없다… NPE 발생해서 한참 헤맸,,,,😥
    • 그래서 아래와 같이 수정해주는 것이 좋음

      1
      2
      3
      4
      5
      6
      7
      8
      9
      
        			for(int i = 0; i < id_list.length; i++) {
              
                    //신고한 유저 중 정지된 id 구하기 - 신고한 사람들을 가져온 다음 신고 횟수가 k(정지 기준)이상이면 피신고자는 정지되었다 >> + 1          
                    Set<String> list = reports.getOrDefault(id_list[i], new HashSet<>());
                    for(String s : list) {
                        if(count.get(s) >= k) answer[i]++;
                    }
              		    
               }
      
  4. 완성 코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
     import java.util.*;
        
     class Solution {
         public int[] solution(String[] id_list, String[] report, int k) {
                
             //신고자 id >  신고 당한 사람 id
             Map<String, Set<String> > reports = new HashMap<>();
                
             //신고당한사람, 신고당한 횟수- n번
             Map<String, Integer> count = new HashMap<>();
                
                
             for(int i = 0 ; i < report.length ; i++ ) {
                 String[] arr = report[i].split(" ");
                    
                 Set<String> list = reports.getOrDefault(arr[0], new HashSet<>());
                 boolean b = list.add(arr[1]);
                 reports.put(arr[0], list);
                    
                 if(b) {
                     count.put(arr[1], count.getOrDefault(arr[1], 0) + 1);
                 }
             }
                
             //결과 담을 배열
             int[] answer = new int[id_list.length];
                
             for(int i = 0; i < id_list.length; i++) {
                    
               //신고한 유저 중 정지된 id 구하기 - 신고한 사람들을 가져온 다음 신고 횟수가 k(정지 기준)이상이면 피신고자는 정지되었다 >> + 1          
                 Set<String> list = reports.getOrDefault(id_list[i], new HashSet<>());
                 for(String s : list) {
                     if(count.get(s) >= k) answer[i]++;
                 }
                  
             }
                     
             return answer;
         }
     }
    

정답률 치고는 어렵지 않은 문제였지만 NPE 때문에 시간 잡아먹었던 문제였다..

예외처리는 미리미리하자🦾






Programmers 카테고리 내 다른 글 보러가기

Leave a comment