본문 바로가기
알고리즘

Programmers - 신고 결과 받기(Java)

by 장중앙 2022. 1. 21.

https://programmers.co.kr/learn/courses/30/lessons/92334

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

 

풀이

 

풀이에 필요한 Map 정의 및 초기화

  • key는 유저아이디, value는 key를 신고한 유저의 아이디의 Set을 가진 Map
    • 동일한 유저에 대한 신고횟수는 1회로 처리하기 때문에 중복을 없애기 위해 Set을 Value로 함
  • key는 유저아이디, value는 임의의 인덱스를 가진 Map을 정의

int[] answer = new int[id_list.length];
Map<String, HashSet<String>> map = new HashMap<>();
Map<String, Integer> idxMap = new HashMap<>();

 

Map 초기화

for (int i = 0; i < id_list.length; i++) {
	String name = id_list[i];
	map.put(name, new HashSet<>());
	idxMap.put(name, i);
}

 

신고 기록

"신고자 Id 신고한 Id"로 입력이 주어지기 때문에 split()함수를 이용해 from과 to를 구분

신고한 Id에 대해 누가 신고했는지 Map에 저장

for (String s : report) {
	String[] str = s.split(" ");
	String from = str[0];
	String to = str[1];
	map.get(to).add(from);
}

 

이용 정지 메일 발송

이용이 정지된 유저에 대해 해당 유저를 신고한 Id에 메일이 몇번 전송되는지 파악

map에는 해당 유저를 신고한 Id Set이 저장되어 있음

 

map을 순회하여 Set마다 사이즈가 2이상인지 확인

  • 2이상이라면 Set(해당 유저를 신고한 ID)에게 메일을 발송
  • idxMap에 맞게 끔, 신고한 Id에 대해 누적값을 1씩 증가
for (int i = 0; i < id_list.length; i++) {
	HashSet<String> send = map.get(id_list[i]);
	if (send.size() >= k) {
		for (String name : send) {
			answer[idxMap.get(name)]++;
		}
    }
}

전체 코드

import java.util.*;
class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        int[] answer = new int[id_list.length];
        Map<String, HashSet<String>> map = new HashMap<>();
        Map<String, Integer> idxMap = new HashMap<>();

        for (int i = 0; i < id_list.length; i++) {
            String name = id_list[i];
            map.put(name, new HashSet<>());
            idxMap.put(name, i);
        }

        for (String s : report) {
            String[] str = s.split(" ");
            String from = str[0];
            String to = str[1];
            map.get(to).add(from);
        }

        for (int i = 0; i < id_list.length; i++) {
            HashSet<String> send = map.get(id_list[i]);
            if (send.size() >= k) {
                for (String name : send) {
                    answer[idxMap.get(name)]++;
                }
            }
        }
        return answer;
    }
}

댓글