문제 바로가기
문제풀이
신고한 사람과 신고당한 사람을 담을 자료구조가 필요하다.
중복을 방지하기 위해 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없이 코드를 작성하는 연습을 많이 해야할 것 같다!
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] 숫자 문자열과 영단어 for JAVA - Map vs String (0) | 2022.03.17 |
---|---|
[프로그래머스] k진수에서 소수 개수 구하기 for JAVA (0) | 2022.01.19 |
[프로그래머스] 쿼드압축 후 개수 세기 for JAVA 분할정복 (0) | 2022.01.05 |
[프로그래머스] 이진 변환 반복하기 for JAVA (0) | 2022.01.04 |
[프로그래머스] 삼각달팽이 for JAVA (0) | 2022.01.02 |