https://programmers.co.kr/learn/courses/30/lessons/92334?language=java
풀이
- answer : id_list에 담긴 순서대로 각 유저가 받은 결과 메일 수
- idMap : 유저별 순서 저장 (key : 유저이름, value : 순서)
- map : 유별 자신을 신고한 유저 (key : 유저이름, value : key를 신고한 유저이름 set)
1. hashmap을 초기화 해준다.
idMap = {muzi=0, frodo=1, apeach=2, neo=3}
map = {muzi=[], neo=[], frodo=[], apeach=[]}
2. report를 split함수로 공백을 기준으로 자른다. (String[] str에 저장)
- str[0](=신고한 유저)이 map의 key와 같으면 str[1](=신고당한 유저)를 map의 value인 hashset에 넣어준다.
- 결과는 다음과 같다.
map = {muzi=[apeach], neo=[muzi, frodo], frodo=[muzi, apeach], apeach=[]}
3. 유저별 자신을 신고한 유저가 k명 이상이면, 그 신고한 유저에게 메일을 보내준다(answer 증가)
- send : 해당 유저를 신고한 유저의 set.
- neo와 frodo의 send.size가 2명 이상이므로, send에 해당하는 유저 muzi, frodo, apeach 의 순서에 맞는 answer값을 증가시켜준다.
idMap = {muzi=0, frodo=1, apeach=2, neo=3}
map = {muzi=[apeach], neo=[muzi, frodo], frodo=[muzi, apeach], apeach=[]}
코드
import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length]; // 메일을 받은 횟수
HashMap<String, Integer> idMap = new HashMap<>(); // 유저 순서저장
HashMap<String, HashSet<String>> map = new HashMap<>(); // 각 유저별 자신을 신고한 유저 set
// init
for(int i=0; i<id_list.length;i++){
idMap.put(id_list[i],i);
map.put(id_list[i],new HashSet<>());
}
// 자신을 신고한 유저이름 저장
for(String r : report){
String[] str = r.split(" ");
map.get(str[1]).add(str[0]);
}
// 유저별 신고당한 횟수가 k보다 많으면 메일보냄
for(int i=0; i<id_list.length;i++){
HashSet<String> set = map.get(id_list[i]); // 해당 유저를 신고한 유저 set
if(set.size() >= k){
for(String userId : set){
// userId가 동일한 순서 answer증가
answer[idMap.get(userId)]++;
}
}
}
return answer;
}
}
'Algorithm & Data Structure > 프로그래머스' 카테고리의 다른 글
[Java] 프로그래머스 : 실패율 (0) | 2022.02.20 |
---|---|
[Java] 프로그래머스 : 정수 내림차순으로 배치하기 (0) | 2022.02.19 |
[Java] 프로그래머스 : 다트 게임 (0) | 2022.02.14 |
[Java] 프로그래머스 : 비밀지도 (0) | 2022.02.14 |
[Java] 프로그래머스 : 완주하지 못한 선수 (feat. HashMap) (0) | 2022.02.14 |