프로그래머스
2022 KAKAO BLIND RECRUITMENT
프로그래머스
코드 중의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
신고 결과 받기
문제 정리
1. k번 이상 신고 다하면 게시판 이용 정지된다.
2. 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송된다.
3. 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일 발송한다.
4. 동일한 유저에 대한 신고 횟수는 1회로 처리된다.
시작하기 전 접근 방법
1.각 유저의 인덱스를 저장
2. 신고를 당한 사람과 그에 해당하는 횟수를 저장할 HashMap<String,Integer> 생성
3. 해당 유저를 신고한 사람을 저장할 HashMap<String,List<String>>을 생성한다.
4. 여기서 List는 해당 유저를 신고한 사람이 1명이 아니기 때문에 list처리(나중에 해당 list를 이용하여 메일 전송하기 위해서)
5. 중복을 확인하기 위한 HashSet을 이용한다.
6. 각 유저별로 k번 이상 신고된 대상을 검사하여 결과 배열에 반영

1. 각 유저의 인덱스를 HashMap에 저장한다.
2. 신고 횟수를 저장할 HashMap, 각 유저가 신고한 대상을 저장할 HashMap, 중복된 신고를 방지하기 위한 HashSet 생성한다.
HashMap<String,Integer> id = new HashMap<>();
for(int i=0; i<id_list.length;i++) {
id.put(id_list[i], i);
}
HashMap<String,Integer> map = new HashMap<>(); // 신고 당한 횟수
HashMap<String,List<String>> main = new HashMap<>(); // 해당 유저를 신고한 사람을 저장한 list
ArrayList<String> find = new ArrayList<>(); // k번 이상 신고된 대상을 찾아서 리스트에 추가
Set<String> duplicateCheck = new HashSet<>(); // 중복 확인용 Set
3. 배열을 반복하여 각 신고마다 처리하며 HashSet을 이용하여 중독된 신고는 처리하지 않기 위해 if문을 사용한다.
4. 신고 대상과 신고 횟수를 저장
5. 신고한 유저와 신고 대상을 list에 저장한다.
for(int i=0; i<report.length; i++){
if (!duplicateCheck.contains(report[i])) {
duplicateCheck.add(report[i]);
String key = report[i].split(" ")[1];
if(map.containsKey(key)){
int value = map.get(key);
map.put(key,value+1);
}else{
map.put(key,1);
}
String mainKey = report[i].split(" ")[0];
List<String> list = main.getOrDefault(mainKey, new ArrayList<>());
list.add(report[i].split(" ")[1]);
main.put(mainKey, list);
}
}
6. k번 이상 신고된 대상을 찾아서 리스트에 추가한다.
7.해당 유저가 신고한 대상 중 k번 이상 신고된 대상을 찾아서 결과 배열에 반영한다.
8. 각 유저별로 k번 이상 신고된 대상을 검사하여 결과 배열에 반영하여 return한다.
for(Map.Entry<String,Integer> entry : map.entrySet()) {
if(entry.getValue()>=k) {
find.add(entry.getKey());
}
}
for (Map.Entry<String, List<String>> entry : main.entrySet()) {
String mainKey = entry.getKey();
List<String> list = entry.getValue();
for (String reportedId : find) {
if (list.contains(reportedId)) {
answer[id.get(mainKey)]++;
}
}
}
최종 코드
더보기
package practice;
import java.util.*;
class SolutionKakao {
public int[] solution(String[] id_list, String[] report, int k) {
HashMap<String,Integer> id = new HashMap<>();
for(int i=0; i<id_list.length;i++) {
id.put(id_list[i], i);
}
HashMap<String,Integer> map = new HashMap<>(); // 신고 당한 횟수
HashMap<String,List<String>> main = new HashMap<>(); // 해당 유저를 신고한 사람을 저장한 list
ArrayList<String> find = new ArrayList<>();
Set<String> duplicateCheck = new HashSet<>(); // 중복 확인용 Set
int[] answer = new int[id_list.length];
for(int i=0; i<report.length; i++){
if (!duplicateCheck.contains(report[i])) {
duplicateCheck.add(report[i]);
String key = report[i].split(" ")[1];
if(map.containsKey(key)){
int value = map.get(key);
map.put(key,value+1);
}else{
map.put(key,1);
}
String mainKey = report[i].split(" ")[0];
List<String> list = main.getOrDefault(mainKey, new ArrayList<>());
list.add(report[i].split(" ")[1]);
main.put(mainKey, list);
}
}
for(Map.Entry<String,Integer> entry : map.entrySet()) {
if(entry.getValue()>=k) {
find.add(entry.getKey());
}
}
for (Map.Entry<String, List<String>> entry : main.entrySet()) {
String mainKey = entry.getKey();
List<String> list = entry.getValue();
for (String reportedId : find) {
if (list.contains(reportedId)) {
answer[id.get(mainKey)]++;
}
}
}
return answer;
}
}
/* k번 이상 신고 다하면 게시판 이용 정지
해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송
유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에
게시판 이용 정지를 시키면서 정지 메일 발송
*/
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 개인정보 수집 유효기간 (1) | 2024.02.20 |
|---|---|
| [프로그래머스] 야근 지수 (0) | 2024.02.12 |
| [프로그래머스] 여행경로(깊이우선탐색) (0) | 2024.02.01 |
| [프로그래머스] 단어 변환(깊이우선탐색) (2) | 2024.02.01 |
| [프로그래머스] 네트워크(깊이우선탐색) (0) | 2024.01.31 |