신고 결과 받기

문제

신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.

  • 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.

  • 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.

  • 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.

  • k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.

    • 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.

예시

다음은 전체 유저 목록이 [“muzi”, “frodo”, “apeach”, “neo”]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다.

유저 ID 신고한 ID 설명
“muzi” “frodo” “muzi”가 “frodo”를 신고했습니다.
“apeach” “frodo” “apeach”가 “frodo”를 신고했습니다.
“frodo” “neo” “frodo”가 “neo”를 신고했습니다.
“muzi” “neo” “muzi”가 “neo”를 신고했습니다.
“apeach” “muzi” “apeach”가 “muzi”를 신고했습니다.

답안

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
import java.util.*;

class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
String[] tmp = new String[2];

HashMap<String, ArrayList<String>> reportHashMap = new HashMap<String, ArrayList<String>>();
Map<String, Integer> result = new LinkedHashMap();


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

// 2. 신고횟수 Hasmap 생성
for(String id : id_list){
reportHashMap.put (id, new ArrayList<String>());
result.put (id, 0);
}

// 3. 해당 사원(신고받은사람)에 신고자 add
for(String rep : report){
tmp = rep.split(" ");
reportHashMap.get(tmp[1]).add(tmp[0]);
}

// 4. k이상이면 메일발송 증가
reportHashMap.forEach((key, value)->{
if(value.size() >= k){
for(String val : value){
result.put(val, result.get(val) + 1);
}
// mailHashMap.put(key, mailHashMap.get(key) + 1);
}
});

// value int배열로 변경후 return
return result.values().stream().mapToInt(Integer::intValue).toArray();
}
}

LinkedHashMap vs HashMap

처음에 result (결과값을 나타내는 Map)를 HashMap으로 구현했었다.
자꾸 로직은 맞다 생각했지만 결과가 다르게 나와 구글에 HashMap 순서를 검색해보았는데
HashMap은 순서대로 저장이 되지 않습니다. 반면, LinkedHashMap은 순서대로 저장 됩니다
라는 검색 결과를 얻게 되어 수정해보니 … 결과가 맞았습니다.

HashMap은 순서대로 저장이 되지 않습니다. 반면, LinkedHashMap은 순서대로 저장 됩니다 중요!

Integer vs int

  1. int (Primitive 자료형)
  • ‘자료형’ 을 의미한다. (int, float, long, double 와 같은 하나의 primitive 자료형을 의미합니다.)
  • ‘산술 연산’이 가능합니다.
  • null 로 초기화 불가능합니다.(0으로 초기화 가능합니다.)
    이러한 점 때문에 자바는 C/C++과 조금의 차이를 보입니다.
  1. Integer (Wrapper 클래스-객체)
  • Wrapper 클래스입니다.
  • Unboxing 을 하지 않으면 산술 연산이 불가능하지만, null값은 처리할 수 있습니다.
  • null값 처리가 용이해서 SQL 과 연동할 경우 처리가 용이. 직접적인 산술연산은 불가능합니다.

* Wrapper 클래스란?
Java는 데이터를 클래스와 객체 외에 기초 타입을 가집니다. 그렇기 때문에 Java는 기본형 타입(위에서 말한 primitive 자료형)과 객체 참조(클래스) 같은 두 가지 타입의 관리 데이터를 가집니다. 경우에 따라서 기본형 타입을 객체로 사용하는 경우가 있으며, 이러현 강우 기본형 타입 값을 객체로 표현해야합니다.
이때 Wrapper 클래스를 사용하는데, 특정 기본형 타입으로 나타냅니다. 예를 들어 Integer 클래스는 간단한 정수 값을 나타내며 객체는 하나의 int값을 저장할 수 있습니다.