[programmers/py] 신고 결과 받기

승민·2023년 4월 17일

알고리즘

목록 보기
17/171

신고결과받기

https://school.programmers.co.kr/learn/courses/30/lessons/92334?language=python3

문제설명

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

  • 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
  • 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
  • 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
    k- 번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
  • 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
  • 다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다

문제 설명 표
표 2

  • 따라서 "muzi"는 처리 결과 메일을 2회, "frodo"와 "apeach"는 각각 처리 결과 메일을 1회 받게 됩니다.

제한사항

  • id_list의 원소는 이용자의 id를 나타내는 문자열이며 알파벳 소문자로만 이루어져 있습니다.
  • id_list에는 같은 아이디가 중복해서 들어있지 않습니다.
  • report의 원소는 "이용자id 신고한id"형태의 문자열입니다.
  • 예를 들어 "muzi frodo"의 경우 "muzi""frodo"를 신고했다는 의미입니다.
  • id는 알파벳 소문자로만 이루어져 있습니다.
  • 이용자id와 신고한id는 공백(스페이스)하나로 구분되어 있습니다.
  • 자기 자신을 신고하는 경우는 없습니다.

풀이

  1. 나:[신고 당한 횟수, [나를 신고한 사람]] 객체를 생성
  2. 받은 메일 수를 계산
def solution(id_list, report, k):   
    
    user = {i : [0, set()] for i in id_list}
    answer = {i:0 for i in id_list}   
    # 나 : [신고 당한 횟수, [나를 신고한 사람]]
    for re in report:
        u, r = re.split(" ") # 이용자, 신고받은 사람
        user[r][1].add(u)
        user[r][0] = len(user[r][1])

    # 받은 메일 수 추가
    for us in user :
        if user[us][0] >= k: # 내가 k번 이상 신고 당함
            for a in user[us][1]:
                # 내가 신고한 사림이 정지 당함
                answer[a] += 1

                    
    return [answer[a] for a in answer]

다른 사람 풀이

def solution(id_list, report, k):
    answer = [0] * len(id_list)    
    reports = {x : 0 for x in id_list}

    for r in set(report):
        reports[r.split()[1]] += 1

    for r in set(report):
        if reports[r.split()[1]] >= k:
            answer[id_list.index(r.split()[0])] += 1

    return answer

0개의 댓글