코딩/알고리즘
[알고리즘] 프로그래머스 신고결과 받기 Java(자바)
유어노우
2022. 1. 14. 14:45
- 문제
https://programmers.co.kr/learn/courses/30/lessons/92334
코딩테스트 연습 - 신고 결과 받기
문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의
programmers.co.kr
- 코드 설명
idIdx를 통해 이름과 index번호를 맵핑해 줍니다.
User 클래스를 생성해서 거기에 내가 신고한 사람 , 나를 신고한 사람을 저장한 후에
내가 k번 이상 신고를 받았으면 suspendedList에 추가했다.
이 후 다시한번 User객체를 for문으로 탐색하여 reportList에 suspendedList에 추가된 사람이 있는지 판별하고
idIdx를 통해 알아낸 index 번호를 통해 answer 값을 증가시켜 줍니다!
문제 자체는 어렵지 않았지만 어떻게 하면 간결하고 보기 쉽게 짤 수 있을 까 고민을 했습니다..
이게 저의 최선이었습니답...
import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
ArrayList<User> users = new ArrayList<>();
HashMap<String,Integer> suspendedList = new HashMap<>(); //<이름,> Integer 값은 중요하지 않음
HashMap<String,Integer> idIdx = new HashMap<String,Integer>(); // <이름, 해당 이름의 User 클래스 idx>
int idx = 0;
//Id 별로 User 객체 생성
for(String name : id_list) {
idIdx.put(name,idx++);
users.add(new User(name));
}
//신고
for(String re : report){
String[] str = re.split(" ");
users.get( idIdx.get(str[0])).reportList.add(str[1]);
users.get( idIdx.get(str[1])).reportedList.add(str[0]);
}
//reportedList의 크기가 k번 이상이면 suspendedList에 추가됨
for(User user : users){
if(user.reportedList.size() >= k)
suspendedList.put(user.name,1);
}
//reportList에 suspendedList가 있으면 answer 증가
for(User user : users){
for(String nameReport : user.reportList){
if(suspendedList.get(nameReport) != null){
answer[idIdx.get(user.name)]++;
}
}
}
return answer;
}
}
class User{
String name; // user 이름
HashSet<String> reportList; //신고한 아이디
HashSet<String> reportedList; // 누구에게 신고 당했는지 -> 중복신고를 걸러냄
public User(String name){
this.name = name;
reportList = new HashSet<>();
reportedList = new HashSet<>();
}
}
- 결과