문제
https://programmers.co.kr/learn/courses/30/lessons/92334
코딩테스트 연습 - 신고 결과 받기
문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의
programmers.co.kr
풀이
Hash로 해결할 수 있었다.
신고 정보를 관리할 reportMap과 신고 메일을 받은 횟수를 관리할 infoMap, 마지막 리턴해줄 때 순서대로 리턴해주기 위한 idxMap을 만들고 reportMap에서는 신고 정보를 바탕으로 모든 원소에 대해 Key : 신고 당한 사람, Value : 신고한 사람들으로 관리해주었다. 이때 Value에는 Set을 사용해주었는데 중복 신고가 되지 않는 점을 생각하여 HashSet을 이용해 중복 신고를 걸러줄 수 있도록 하였다.
신고 정보를 공백 단위 split으로 잘라주면 신고한 사람과 신고 당한 사람의 정보를 얻을 수 있고, 그 정보를 바탕으로 reportMap을 채워주면 된다.
reportMap을 채운 이후에는 k번 이상의 신고를 받은 사람들을 찾아내고, 그 사람들을 신고한 사람에 대해 for문을 돌며 infoMap에 Key : 유저 이름, Value : 메일을 받은 횟수로 테이블을 채워주었다. 이러면 메일 받은 횟수와 그 사람의 이름을 찾아냈으니 처음에 만든 idxMap을 이용해서 원래 순서에 맞게 리턴할 수 있도록 answer에 대입해주면 문제를 해결할 수 있다.
코드
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> infoMap = new HashMap<>();
HashMap<Integer, String> idxMap = new HashMap<>();
for(int i = 0; i < id_list.length; i++) {
idxMap.put(i, id_list[i]);
reportMap.put(id_list[i], new HashSet<>());
infoMap.put(id_list[i], 0);
}
for (String element : report) {
String[] action = element.split(" ");
reportMap.get(action[1]).add(action[0]);
}
for (String user : id_list) {
if(reportMap.get(user).size() >= k) {
for (String name : reportMap.get(user)) {
infoMap.put(name, infoMap.get(name) + 1);
}
}
}
for(int i = 0; i < id_list.length; i++) {
String targetName = idxMap.get(i);
answer[i] = infoMap.get(targetName);
}
return answer;
}
}
'프로그래머스' 카테고리의 다른 글
[프로그래머스] 프로그래머스 Level2 소수 찾기 Java (0) | 2022.05.26 |
---|---|
[프로그래머스] 프로그래머스 Level2 더 맵게 Java (0) | 2022.05.26 |
[프로그래머스] 프로그래머스 Level1 [1차] 다트 게임 Java (카카오 코딩테스트) (0) | 2022.05.25 |
[프로그래머스] 프로그래머스 Level1 완주하지 못한 선수 Java (0) | 2022.05.25 |
[프로그래머스] 프로그래머스 Level1 키패드 누르기 Java (카카오 코딩테스트) (0) | 2022.05.24 |