프로그래머스 - 신고 결과 받기 (C#)

Leedong·2022년 7월 1일
0

programmers

목록 보기
1/18

문제 설명

신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.

  • 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
  • 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
  • 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
  • k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
  • 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.

문제 풀이

시작 코드

using System;

public class Solution {
    public int[] solution(string[] id_list, string[] report, int k) {
        int[] answer = new int[] {};
        return answer;
    }
}

파라미터로 유저 ID 목록 id_list, 신고 리포트 목록 report, 정지 기준이 되는 신고 횟수 k
를 받습니다.

최종적으로 id_list에 담긴 id 순서대로 각 유저가 신고한 처리 결과 메일을 받은 횟수를 int형 배열로 반환해야 합니다.
유저가 신고한 다른 유저가 정지를 당해야 메일을 받을 수 있습니다.

정리해보면 신고한 다른 유저가 정지 기준 이상이면 정지 기준 이상인 다른 유저를 신고한 유저는 메일을 받은 횟수를 늘려줘야 합니다.

동일한 유저에 대한 신고는 1회로 처리되야 합니다. 신고 기록 등을 저장해서 Contains 관련 메서드로 신고가 중복되지 않도록 해야할 것 같습니다.

신고 당한 유저의 신고한 유저 목록을 알면 신고한 유저 목록 카운트와 k를 비교해서 정지 여부를 알 수 있고 신고한 유저 목록에 있는 유저들의 메일 횟수 1을 늘려주면 될 것 같습니다.

신고 당한 유저를 Key, 신고한 유저 목록을 List 형식의 Value로 Dictionary를 생성했습니다.

// Key : 신고 당한 유저 / Value : 신고한 유저 목록
Dictionary<string, List<string>> dic = new Dictionary<string, List<string>>();

report의 값을 Split()을 이용해서 신고한 유저를 give, 신고 당한 유저를 take로 합니다.
신고 당한 유저가 dic의 Key로 존재하지 않으면 새로 생성합니다.
존재하는 경우 dic[take]로 신고한 유저 목록을 가져와서 목록에 신고한 유저의 이름이 이미 포함되어 있는지 Contains로 비교합니다.

for (int i = 0; i < report.Length; i++)
{
	string[] str = report[i].Split(' ');

	string give = str[0];
    string take = str[1];

	if (!dic.ContainsKey(take))
    {
    	List<string> list = new List<string>();
        list.Add(give);
        dic.Add(take, list);
        continue;
	}

	if (!dic[take].Contains(give))
    {
    	dic[take].Add(give);
	}
}

마지막으로 id_list를 불러와서
dic목록의 각 Value에 id_list 현재 인덱스의 유저 ID 포함 여부 확인 ->
해당 목록(신고자 목록)의 카운트(신고 횟수)가 k보다 높거나 같은지 확인 ->
answer[index]의 값을 1 증가

제출 코드

using System;
using System.Collections;
using System.Collections.Generic;

public class Solution 
{
    public int[] solution(string[] id_list, string[] report, int k) 
    {
        int[] answer = new int[id_list.Length];

        Dictionary<string, List<string>> dic = new Dictionary<string, List<string>>();

        for (int i = 0; i < report.Length; i++)
        {
            string[] str = report[i].Split(' ');

            string give = str[0];
            string take = str[1];

            if (!dic.ContainsKey(take))
            {
                List<string> list = new List<string>();
                list.Add(give);
                dic.Add(take, list);
                continue;
            }

            if (!dic[take].Contains(give))
            {
                dic[take].Add(give);
            }
        }

        for (int i = 0; i < id_list.Length; i++)
        {
            foreach (KeyValuePair<string, List<string>> item in dic)
            {
                if (item.Value.Contains(id_list[i]))
                {
                    if (item.Value.Count >= k)
                    {
                        answer[i] = ++answer[i];
                    }
                }                
            }
        }

        return answer;
    }
}
profile
Unity, C#

0개의 댓글