티어 : Lv. 1
정답여부 : 오답
💡문제
신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
- 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
- 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
- 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
- k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
- 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다.

위 예시에서는 2번 이상 신고당한 "frodo"와 "neo"의 게시판 이용이 정지됩니다. 이때, 각 유저별로 신고한 아이디와 정지된 아이디를 정리하면 다음과 같습니다.

따라서 "muzi"는 처리 결과 메일을 2회, "frodo"와 "apeach"는 각각 처리 결과 메일을 1회 받게 됩니다.
이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- 2 ≤ id_list의 길이 ≤ 1,000
- 1 ≤ report의 길이 ≤ 200,000
- 1 ≤ k ≤ 200, k는 자연수입니다.
- return 하는 배열은 id_list에 담긴 id 순서대로 각 유저가 받은 결과 메일 수를 담으면 됩니다.
💡입출력 예

💡문제 분석 요약
- 해당 아이디들이 신고를 한 아이디 중 경고 조치를 받은 아이디의 개수를 구하면 되는 문제
💡알고리즘 설계
- reportMap : 신고당한자 와 신고자
- reportCount : 신고당한자 : 신고 당한 횟수
- 신고를 당한 경우가 있으면 신고를 한 사람과 신고 횟수를 추가
- 각 신고당한 횟수를 비교하면서 경고조치 인 경우
- 해당 신고를 한 사람에 수를 추가
💡시간복잡도
- O(n^2)
💡코드
import java.util.HashMap;
import java.util.HashSet;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
// 각 아이디에 신고한 유저들을 넣어준다.
HashMap<String, HashSet<String>> reportMap = new HashMap<>();
HashMap<String, Integer> reportCount = new HashMap<>();
// 신고 처리
for (String r : report) {
String[] parts = r.split(" ");
String reporter = parts[0]; // 신고한 아이디
String reported = parts[1]; // 신고당한 아이디
// 신고한 아이디가 id_list에 있는 경우에만 처리
reportMap.putIfAbsent(reported, new HashSet<>());
reportMap.get(reported).add(reporter); // 신고자 추가
// 신고당한 횟수 증가
reportCount.put(reported, reportCount.getOrDefault(reported, 0) + 1);
}
// 결과 배열 계산
for (String reportedId : reportCount.keySet()) {
int count = reportCount.get(reportedId);
if (count >= k) { // 신고당한 횟수가 k 이상인 경우
for (int i = 0; i < id_list.length; i++) {
if (reportMap.containsKey(reportedId) && reportMap.get(reportedId).contains(id_list[i])) {
answer[i]++;
}
}
}
}
return answer; // 괄호 닫기 수정
}
}
💡 틀린 이유
중복값 해당 아이디는 신고가 한번만 된다.
💡 틀린 부분 수정 or 다른 풀이
import java.util.HashMap;
import java.util.HashSet;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
HashMap<String, HashSet<String>> reportMap = new HashMap<>();
HashMap<String, Integer> reportCount = new HashMap<>();
// 신고 처리
for (String r : report) {
String[] parts = r.split(" ");
String reporter = parts[0]; // 신고한 아이디
String reported = parts[1]; // 신고당한 아이디
// 신고한 아이디가 id_list에 있는 경우에만 처리
reportMap.putIfAbsent(reported, new HashSet<>());
if (!reportMap.get(reported).contains(reporter)) { // 중복 신고 확인
reportMap.get(reported).add(reporter); // 신고자 추가
// 신고당한 횟수 증가
reportCount.put(reported, reportCount.getOrDefault(reported, 0) + 1);
}
}
// 결과 배열 계산
for (String reportedId : reportCount.keySet()) {
int count = reportCount.get(reportedId);
if (count >= k) { // 신고당한 횟수가 k 이상인 경우
for (int i = 0; i < id_list.length; i++) {
if (reportMap.containsKey(reportedId) && reportMap.get(reportedId).contains(id_list[i])) {
answer[i]++;
}
}
}
}
return answer;
}
}
💡 느낀점
Hashset , putIfAbsent
해시 알고리즘에 대해 공부를 해야겠다.
'CodingTest > Programmers' 카테고리의 다른 글
[PGM]폰켓몬 (0) | 2024.08.12 |
---|---|
[PGM]길 찾기 게임 (0) | 2024.08.06 |
[PGM]의상 (0) | 2024.07.29 |
[PGM]베스트앨범 (0) | 2024.07.25 |
[PGM]오픈채팅방 (5) | 2024.07.24 |