1 minute read

신고결과받기

문제

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

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

입출력 예

id_list report k result
["muzi", "frodo", "apeach", "neo"] ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"] 2 [2,1,1,0]
["con", "ryan"] ["ryan con", "ryan con", "ryan con", "ryan con"] 3 [0,0]

해결 방안

  • 신고 당한 유저를 key로 하고, 신고 당한 횟수와, 신고한 유저를 value로 가지는 dict로 생성

  • 값이 있는지 확인하면서 하면 코드가 복잡해지고 느려질거같아서 미리 id_list로 초기화를 하였다.

    for x in id_list:
            report_count[x] = (0,[])	# key : 신고 당한 유저 
            emailCnt[x] = 0				# key : user , value : 정지 메일을 발송할 횟수
    
  • 신고 내역이 담겨있는 report를 돌아가면서 중복 신고가 아니면 배열에 적용해준다
  • report_count의 결과를 가지고 k번 이상의 신고를 당한 유저를 신고한 유저들의 email count를 하나씩 증가시켜준다.

  • answer에 id_list의 순서로 딕셔너리인 emailCnt의 횟수를 저장해주고
  • answer을 리턴

풀이 코드

def solution(id_list, report, k):
    answer = []

    report_count = dict()   # 신고 횟수 저장
    emailCnt = dict()
    # report_count 초기화 : 신고 0, 신고 user list 빈배열
    for x in id_list:
        report_count[x] = (0,[])
        emailCnt[x] = 0
        
    # 신고 내용 취합
    for x in report:
        user, userToReport = x.split(" ")
        # 신고당한 횟수, 신고한 user 리스트
        if user in report_count[userToReport][1]:
            continue
        report_count[userToReport] = (report_count[userToReport][0]+1, report_count[userToReport][1]+[user])

    for cnt, userList in report_count.values():
        if k <= cnt:
            for x in userList:
                emailCnt[x] +=1
    # print(report_count)
    # print(emailCnt)
    for x in id_list:
        answer.append(emailCnt[x])
    return answer

if __name__ == '__main__':
    id_list = ["muzi", "frodo", "apeach", "neo"]
    report = ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]
    k = 2
    print( solution(id_list, report, k))

느낀점

딕셔너리 (해시)에 대해 많이 이해하게 되는 연습이였던거 같다.

생각했던 것 처럼 하니까 어렵지 않게 풀려서 많이 늘었구나를 느꼈다.

Tags:

Categories:

Updated: