Description
신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
- 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
- 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
- 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
- k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
- 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다.
Solotion.1
public int[] solution(String[] id_list, String[] report, int k) {
// set User Info
int userCnt = id_list.length;
HashMap<String,User> users = new HashMap<>();
for (int i = 0; i < userCnt; i++) { //initialize users
users.put(id_list[i], new User(id_list[i]));
}
// set Report Info
Set<String> stoppedUserIds = new HashSet<>(); // 정지 대상 유저 목록
for (String r : report){
String[] arr = r.split(" ");
if(users.get(arr[0]).reportedUser.add(arr[1])){ // 신고 유저목록추가 >> 들어가 있지 않으면 count++
users.get(arr[1]).reportedCnt++;
if(users.get(arr[1]).reportedCnt >= k){ // k이상이면 정지대상 유저 목록에 추가
stoppedUserIds.add(users.get(arr[1]).id);
}
}
}
//set result
int[] result = new int[userCnt];
for (int i = 0; i < userCnt; i++) {
for(String stoppedUserId : stoppedUserIds){
if(users.get(id_list[i]).reportedUser.contains(stoppedUserId)){
result[i]++;
}
}
}
return result;
}
private class User{
private String id;
private Set<String> reportedUser; // 신고한 유저 목록 (중복X)
private int reportedCnt; // 신고 당한 횟수
public User(String _id){
this.id = _id;
reportedUser = new HashSet<>();
}
}
객체지향적으로 User Class를 만들어 처리하는 코드입니다. 각 유저별로 id와 신고한 유저목록, 신고 당한 횟수를 가지고 있고 report 배열 데이터를 분석하여 각각 데이터를 세팅해 줍니다. 주의할 점은 한 사람이 같은 사람을 신고 할 경우에는 Set를 활용해 put()반환값이 false일 경우는 신고횟수를 추가하지 않아야 합니다.
Reference
'알고리즘 > Programmers' 카테고리의 다른 글
[Programmers] 숫자 문자열과 영단어 - 문제풀이 (0) | 2022.01.19 |
---|