문제 설명
풀이 : Success
소스 코드
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
// 사용자별 신고당한 건수(Key 사용자, value 신고건수)
Map<String, Integer> reportedUser = new HashMap<>();
// 사용자별 신고현황(중복 제거)
Set<String> reportSet = new HashSet<>(Arrays.asList(report));
// 사용자별 신고대상(key 사용자, value 신고대상)
Map<String, String> reportedUserByUser = new HashMap<>();
// 정지된 사용자 내역
List<String> stoppedUserList = new ArrayList<>();
// 사용자별 신고대상 정지 처리건수(결과값)
int[] result = new int[id_list.length];
for (String id : id_list) {
reportedUser.put(id, 0);
}
for (String id : reportSet) {
String[] users = id.split(" ");
reportedUserByUser.put(users[0], reportedUserByUser.getOrDefault(users[0], "") + " " + users[1]);
reportedUser.put(users[1], reportedUser.get(users[1]) + 1);
}
for (Map.Entry<String, Integer> entry : reportedUser.entrySet()) {
if (entry.getValue() >= k) {
stoppedUserList.add(entry.getKey());
}
}
int i = 0;
for (String id : id_list) {
if (reportedUserByUser.containsKey(id)) {
String[] users = reportedUserByUser.get(id).split(" ");
for (String user : users) {
if (stoppedUserList.contains(user)) result[i]++;
}
}
i++;
}
return result;
}
}
풀이 회고
우선 문제를 풀기 위해 다음과 같이 5개의 자료구조를 선언하였습니다.
- 사용자별로 신고당한 건수를 저장하기 위한 HashMap(key : 사용자, value : 신고 건수)
- 사용자별 신고 현황을 중복 없이 저장하기 위한 HashSet
- 사용자별 신고 대상을 저장하기 위한 HashMap(key : 사용자, value : 신고 대상)
- 정지된 사용자 내역을 저장하기 위한 ArrayList
- 최종 결과값을 저장하기위한 정수형(int) 배열
우선 다음과 같이 입력받은 사용자별로 신고당한 건수를 0으로 초기화 시켜주었습니다. 이는 추후에 신고를 받을 때마다 +1을 해주기 위함입니다.
for (String id : id_list) {
reportedUser.put(id, 0);
}
중복이 제거된 "사용자별 신고현황 HastSet 자료구조"를 for 반복문을 통해 사용자별로 순회하면서 사용자별로 누구를 신고했는지를 알아내고 이를 "사용자별 신고대상 HashMap 자료구조"에 각각 저장시키도록 했습니다. 또한 신고받은 사용자는 앞서 초기화 했던 "사용자별 신고당한 건수 HashMap 자료구조"에서 건수를 +1 하였습니다.
for (String id : reportSet) {
String[] users = id.split(" ");
reportedUserByUser.put(users[0], reportedUserByUser.getOrDefault(users[0], "") + " " + users[1]);
reportedUser.put(users[1], reportedUser.get(users[1]) + 1);
}
위 작업이 모두 종료되면 "사용자별 신고당한 건수 HashMap 자료구조"에서 정지가 되는 신고 건수 이상 신고된 사용자들을 "정지된 사용자 내역 ArrayList 자료구조"에 저장시키도록 했습니다.
for (Map.Entry<String, Integer> entry : reportedUser.entrySet()) {
if (entry.getValue() >= k) {
stoppedUserList.add(entry.getKey());
}
}
이후 최종적으로 신고한 주체(사용자)에게 본인이 신고한 게 몇 건이 처리되었는지를 결과값으로 반환하기 위해 자신이 신고한 대상이(reportedUserByUser.containsKey(id)) 정지 됐는지 확인(stoppedUserList.contains(user))한 후 +1 연산 시켜주도록 했다.
int i = 0;
for (String id : id_list) {
if (reportedUserByUser.containsKey(id)) {
String[] users = reportedUserByUser.get(id).split(" ");
for (String user : users) {
if (stoppedUserList.contains(user)) result[i]++;
}
}
i++;
}
return result;
참고자료
- https://programmers.co.kr/learn/courses/30/lessons/92334
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] 타겟 넘버 - Java (0) | 2022.02.28 |
---|---|
[프로그래머스] k진수에서 소수 개수 구하기 - Java (0) | 2022.02.18 |
[프로그래머스] K번째 수 - Java (0) | 2022.01.19 |
[프로그래머스] 이상한 문자 만들기 - Java (0) | 2022.01.19 |
[프로그래머스] 모의고사 - Java (0) | 2022.01.19 |