728x90
반응형
프로그래머스 2022 KAKAO BLIND 테스트 문제였던 "신고 결과 받기" 자바 문제 풀이 공유드립니다.
https://school.programmers.co.kr/learn/courses/30/lessons/92334?language=java
- 문제
신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
각 유저별로 신고당한 횟수는 다음과 같습니다. 위 예시에서는 2번 이상 신고당한 "frodo"와 "neo"의 게시판 이용이 정지됩니다. 이때, 각 유저별로 신고한 아이디와 정지된 아이디를 정리하면 다음과 같습니다. 따라서 "muzi"는 처리 결과 메일을 2회, "frodo"와 "apeach"는 각각 처리 결과 메일을 1회 받게 됩니다. 이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요. ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 제한사항
입출력 예 설명 입출력 예 #1 문제의 예시와 같습니다. 입출력 예 #2 "ryan"이 "con"을 4번 신고했으나, 주어진 조건에 따라 한 유저가 같은 유저를 여러 번 신고한 경우는 신고 횟수 1회로 처리합니다. 따라서 "con"은 1회 신고당했습니다. 3번 이상 신고당한 이용자는 없으며, "con"과 "ryan"은 결과 메일을 받지 않습니다. 따라서 [0, 0]을 return 합니다. |
- 풀이
중복 신고를 제거하기 위해서 HashMap과 HashSet을 사용했습니다.
- Set : 데이터를 중복 저장할 수 없음
- HashSet : Set 인터페이스를 사용, 중복된 값을 저장할 수 없음, put() 메소드를 사용해 데이터를 저장
- HashMap : Map 인터페이스를 사용, 중복된 값을 저장할 수 있음, add() 메소드를 사용해 데이터를 저장
package algorithms;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
/*
* 코딩테스트 연습 > 2022 KAKAO BLIND RECRUITMENT >신고 결과 받기
*/
public class S12 {
public static int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
//동일한 유저ID에 대한 신고횟수는 1회로 처리하기 때문에 중복을 허용하지 않는 HashSet을 value로 사용.
Map<String, HashSet<String>> reportMap = new HashMap<>(); // [신고한ID, [신고된ID]]
Map<String, Integer> answerMap = new HashMap<>(); // [신고된ID, 메일수]
//1. reportMap, answerMap 초기화
for(int i=0; i<id_list.length; i++) {
HashSet<String> reportingId = new HashSet<>();
reportMap.put(id_list[i], reportingId); // 유저ID, 신고한ID로 초기 셋팅
answerMap.put(id_list[i], 0); // 유저ID, 메일수 0으로 셋팅
}
//System.out.println("reportMap : " + reportMap ); // {muzi=[], neo=[], frodo=[], apeach=[]}
//System.out.println("answerMap : " + answerMap ); // {muzi=0, neo=0, frodo=0, apeach=0}
//2. [신고한ID, [신고된ID]]으로 reportMap 맵에 추가.
for(int i=0; i<report.length; i++) {
String[] reportArr = report[i].split(" ");
String userId = reportArr[0]; //신고한ID
String reportId = reportArr[1]; //신고된ID
reportMap.get(reportId).add(userId);//신고된ID를 key값으로 신고한ID 배열을 value로 셋팅
}
//System.out.println("reportMap " + reportMap); // reportMap {muzi=[apeach], neo=[muzi, frodo], frodo=[muzi, apeach], apeach=[]}
//3. 유저가 받은 이용 정지 결과 메일 셋팅
for(String reportId : reportMap.keySet()) { // reportId는 신고된 유저ID
HashSet<String> userMailSend = reportMap.get(reportId); // userMailSend는 신고된유저ID(reportId)를 신고한 유저ID
// System.out.println("reportId: "+ reportId+ " userMailSend: " + userMailSend + " userMailSend.size(): "+userMailSend.size());
// reportId: muzi userMailSend: [apeach] userMailSend.size(): 1
// reportId: neo userMailSend: [muzi, frodo] userMailSend.size(): 2
// reportId: frodo userMailSend: [muzi, apeach] userMailSend.size(): 2
// reportId: apeach userMailSend: [] userMailSend.size(): 0
//신고된 횟수가 K번 이상인 경우
if(userMailSend.size()>=k) {
for(String userId : userMailSend) {
//answerMap에 신고된Id별로 메일 수 넣기
answerMap.put(userId, answerMap.get(userId)+1);
}
}
// System.out.println("answerMap: " +answerMap);
// answerMap: {muzi=0, neo=0, frodo=0, apeach=0}
// answerMap: {muzi=1, neo=0, frodo=1, apeach=0}
// answerMap: {muzi=2, neo=0, frodo=1, apeach=1}
// answerMap: {muzi=2, neo=0, frodo=1, apeach=1}
}
// 4. id_list별 받은 메일수 answer에 셋팅
for(int i=0; i<id_list.length; i++) {
answer[i] = answerMap.get(id_list[i]);
}
return answer;
}
public static void main(String[] args) {
String[] id_list = {"muzi", "frodo", "apeach", "neo"};
String[] report = {"muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"};
int k = 2;
String[] id_list2 = {"con", "ryan"};
String[] report2 = {"ryan con", "ryan con", "ryan con", "ryan con"};
int k2 = 2;
System.out.println(Arrays.toString(solution(id_list, report, k)));
System.out.println(Arrays.toString(solution(id_list2, report2, k2)));
}
}
- 실행결과
728x90
반응형
'프로그래밍 > 알고리즘' 카테고리의 다른 글
프로그래머스 > 월간 코드 챌린지 시즌2 > 음양 더하기 자바 (0) | 2022.09.03 |
---|---|
프로그래머스 > 연습탐욕법(Greedy) > 체육복 자바 (1) | 2022.09.03 |
정렬 알고리즘(버블,삽입, 선택, 퀵, 머지) (4) | 2017.12.28 |
백준 알고리즘 14502번 연구소(DFS 문제) !! (0) | 2017.10.20 |
백준 알고리즘 2667번 단지번호붙이기!! (0) | 2017.10.19 |