Algorithm/Programmers
[프로그래머스] 신고 결과 받기 for Java - HashMap 를 적용한 풀이
devdange
2022. 1. 17. 22:15
문제 바로가기
코딩테스트 연습 - 신고 결과 받기
문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의
programmers.co.kr
문제풀이
신고한 사람과 신고당한 사람을 담을 자료구조가 필요하다.
중복을 방지하기 위해 HashMap을 사용했다.
또한, 신고한 사람은 본인이 신고한 사람의 집합도 가지고 있어야하기 때문에 이를 저장하기 위해 Set 자료구조를 사용했다.
변수
- reporter : 입력받은 report 중 신고를 한 유저
- singo : 입력받은 report 중 신고를 당한 유저
- reporterArr : 신고한 사람을 저장하는 HashMap
- key : 신고를 한 유저(String)
- value : key가 신고한 유저들의 집합(set)
- singoArr : 신고당한 사람을 저장하는 HashMap
- key : 신고당한 유저(String)
- value : key가 신고당한 횟수(int)
- answer : 결과값을 나타내는 1차원 배열
구현
1. id_list 배열에 따라 reporterArr, singoArr 초기화
2-1. reporterArr에 reporter-singo set이 존재하면 이미 신고한 사람이 있는 것이므로 continue
2-2. 존재하지 않으면 신고당한 사람의 카운트가 증가해야 하기 때문에 singoArr에 singo에 해당하는 value값에 1을 더함
3. singoArr에서 신고당한 횟수가 K보다 작으면 해당 singo는 reporterArr에서 제거
4. id_list에 해당하는 reporterArr의 갯수를 answer에 저장
💡Solution
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
class Solution {
public int[] solution(String[] id_list, String[] report, int k) {
int[] answer = new int[id_list.length];
HashMap<String, Set<String>> reporterArr = new HashMap<String, Set<String>>();
HashMap<String, Integer> singoArr = new HashMap<String, Integer>();
// 초기화
for (String id : id_list) {
singoArr.put(id, 0);
reporterArr.put(id, new HashSet<String>());
}
// 신고된 사람들
for (String cur : report) {
StringTokenizer st = new StringTokenizer(cur, " ");
String reporter = st.nextToken();
String singo = st.nextToken();
if (reporterArr.get(reporter).add(singo)) {
singoArr.put(singo, singoArr.get(singo) + 1);
}
}
// 신고한 사람
for (String cur : report) {
StringTokenizer st = new StringTokenizer(cur, " ");
String reporter = st.nextToken();
String singo = st.nextToken();
// 본인이 신고한 사람의 신고당한 횟수가 K이상일 경우이만 남겨
if (singoArr.get(singo) < k)
reporterArr.get(reporter).remove(singo);
}
for (int i = 0; i < id_list.length; i++) {
answer[i] = reporterArr.get(id_list[i]).size();
}
return answer;
}
}
마치며
HashMap, Set의 특성을 이해하여 적합한 문제에 적용할 수 있는 능력을 향상해야할 것 같다.
처음에 이중for문만 돌리고.. 문제의 특성에 맞는 자료구조를 생각해내지 못해 시간낭비(?)를 했다.
또한, 각 자료구조가 가지고있는 메소드를 정확히 알고 IDE없이 코드를 작성하는 연습을 많이 해야할 것 같다!