GitHub 자세히보기

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없이 코드를 작성하는 연습을 많이 해야할 것 같다!