프로그래머스 - 신고 결과 받기 [75]
신고결과받기
문제
신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
- 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
- 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
- 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 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))
느낀점
딕셔너리 (해시)에 대해 많이 이해하게 되는 연습이였던거 같다.
생각했던 것 처럼 하니까 어렵지 않게 풀려서 많이 늘었구나를 느꼈다.