카테고리 없음

[programmers] 신고 결과 받기 (JAVA)

MoveForward 2024. 7. 24. 22:40

[ 2022 KAKAO BLIND RECRUITMENT - 신고 결과 받기 ]

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

 

프로그래머스

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

programmers.co.kr

 

[접근 방법 - 내가 해결한 방법]

1. 2차원 배열로 '신고 내역 (recode)' 을 기록한다.

2. k 번 이상 신고 당한 '정리 회원 리스트 (ban_list)' 를 작성한다.

3. 신고자에게 메일 발송 수 리스트를 작성한다.

 

[JAVA 코드 - 내가 해결한 방법]

import java.util.*;

class PM_92334 {
  
  public int[] solution(String[] id_list, String[] report, int k) {
    int[] answer = new int[id_list.length];

    Map<String, Integer> map = new HashMap<>();
    for (int i = 0; i < id_list.length; i++) {
      map.put(id_list[i], i);
    }

    //신고 기록
    int[][] recode = new int[id_list.length][id_list.length];
    for (String r : report) {
      String[] id = r.split(" ");
      recode[map.get(id[0])][map.get(id[1])] = 1;
    }

    //정지 유저 리스트
    List<Integer> ban_list = new ArrayList<>();
    for (int i = 0; i < id_list.length; i++) {
      int sum = 0;
      for (int j = 0; j < id_list.length; j++) {
        sum += recode[j][i];
      }
      
      if (sum >= k) {ban_list.add(i);}
    }

    //정비 메일 발송 건수
    for (int i = 0; i < id_list.length; i++) {
      int sum = 0;
      for (int j : ban_list) {
        sum += recode[i][j];
      }
      
      answer[i] = sum;
    }

    return answer;
  }
}

 

 

이렇게 작성하며 문제를 풀었는데, 다른 사람의 코드를 보던 중 더 깔끔한 풀이가 있어 가져왔다.

 

[JAVA 코드]

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

class Solution {
  public int[] solution(String[] id_list, String[] report, int k) {
      List<String> list = Arrays.stream(report).distinct().collect(Collectors.toList());
      HashMap<String, Integer> count = new HashMap<>();
      for (String s : list) {
          String target = s.split(" ")[1];
          count.put(target, count.getOrDefault(target, 0) + 1);
      }

      return Arrays.stream(id_list).map(_user -> {
          final String user = _user;
          List<String> reportList = list.stream().filter(s -> s.startsWith(user + " ")).collect(Collectors.toList());
          return reportList.stream().filter(s -> count.getOrDefault(s.split(" ")[1], 0) >= k).count();
      }).mapToInt(Long::intValue).toArray();
  }
}

 

여기서 인상 깊은 부분이 여러군데 있어 정리하여 남겨두려고 한다.

1. stream 의 'distinct()' 를 이용해서, 중복된 신고를 모두 지운 것

List<String> list = Arrays.stream(report).distinct().collect(Collectors.toList());

 

2. map.getOrDefault( 'key', 'value' ) 를 이용한 것

존재하지 않은 'key' 로 조회할 경우, 기본값 'value' 값을 반환 하는 것.

count.put(target, count.getOrDefault(target, 0) + 1);

 

 

 

[앞으로 해야할 일]

JAVA 에 많은 부족함을 느낀다. 

앞으로도 JAVA 에 능숙해 지기 위해 노력해야 한다.