import java.util.*;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
//HashMap<Key,Value>로 설정;
HashMap<String, Integer> Hm = new HashMap<>();
int id_list_len = id_list.length;
HashSet<Integer>[] Hs = new HashSet[id_list_len];
for(int i=0; i< id_list_len; i++)
Hs[i] = new HashSet<>();
// 신고당한 횟수
int[] cnt = new int[id_list_len];
// HashMap에 아이디를 0,1,2..의 인덱스로 변환
for(int i =0; i< id_list_len; i++)
Hm.put(id_list[i],i);
for(String rep : report){
String[] list = rep.split(" ");
//get으로 신고한 id의 인덱스 번호를 id1에 저장
int id1 = Hm.get(list[0]);
//get으로 신고당한 id의 인덱스 번호를 id2에 저장
int id2 = Hm.get(list[1]);
//add를 사용해 Hashset의 신고당한 인덱스에 신고한 사람을 추가
Hs[id2].add(id1);
}
for(int i =0; i< id_list_len; i++){
if(Hs[i].size() <k) continue;
//Hs에 저장된 신고한 사람들의 인덱스 값을 증가
for(int x : Hs[i]) cnt[x]++;
}
return cnt;
}
}
2022년 카카오 블라인드 코딩테스트 1번 문제입니다.
게시판 이용자들 중에 신고가 누적 된 사람은 게시판 이용을 못하게 되고, 신고한 사람에게 신고결과메일을 보내주게 됩니다. 신고한 사람이 받는 메일의 개수를 구하는 문제입니다.
문제를 읽고 해시맵이 떠오르지 않는다면 풀이는 힘들 수 있습니다.
저도 한시간가량 헤매다 풀었다는... 여전히 실력이 많이 부족하네요 ㅠ 더 열심히!!
HashMap
HashMpa은 Map 인터페이스를 구현한 대표적인 Map 컬렉션입니다. Map 인터페이스를 상속하고 있기에 Map의 성질을 그대로 가지고 있습니다. Map은 키와 값으로 구성된 Entry객체를 저장하는 구조를 가지고 있는 자료구조입니다. 여기서 키와 값은 모두 객체입니다. 만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치됩니다. HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보입니다.
위 그림과 같이 HashMap은 내부에 '키'와 '값'을 저장하는 자료 구조를 가지고 있습니다. HashMap은 해시 함수를 통해 '키'와 '값'이 저장되는 위치를 결정하므로, 사용자는 그 위치를 알 수 없고, 삽입되는 순서와 들어 있는 위치 또한 관계가 없습니다.
문제에서 사용한 HashMap의 메소드
get(Key)
인자로 주어진 Key와 매핑되는 Value를 반환해줍니다.
HashMap에 Key가 없다면 null을 반환합니다.
put(Key, Value)
인자로 주어진 Key = Value 쌍을 HashMap에 추가합니다.
만약 HashMap안에 Key가 존재할 경우, 나중에 put된 value가 들어갑니다.