문제 설명
신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
- 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
- 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
- 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
- k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
- 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
나의 풀이
- 딕셔너리를 신고한 딕셔너리, 신고당한 딕셔너리로 나누기 & id 길이 만큼 answer 빈 리스트 만들기
- report를 돌면서 reported_idc에 신고당한 유저 데이터 입력
- 만약 그 횟수가 k 이상이면 reported_dic의 밸류 값을 reporting_idc에 추가
- 마지막으로 reporting_idc을 돌면서 벨류의 길이를 answer에서 해당 인덱스를 찾아 넣기
def solution(id_list, report, k):
answer = [0] * len(id_list)
reported_dic = {} # {frodo : {"muzi", "apeach"}} 신고 당한 frodo
reporting_dic = {} # {apeach : {"muzi", "frodo"}} 신고한 apeach
for r in report:
texts = r.split()
report_user = texts[0]
reported_user = texts[1]
if reported_user not in reported_dic:
reported_dic[reported_user] = set()
reported_dic[reported_user].add(report_user)
if len(reported_dic[reported_user]) >= k:
for reporting_user in reported_dic[reported_user]:
if reporting_user not in reporting_dic :
reporting_dic[reporting_user] = set()
reporting_dic[reporting_user].add(reported_user)
for user in reporting_dic:
lenght = len(reporting_dic[user])
answer[id_list.index(user)] = lenght
return answer
다른 풀이
- 먼저 신고한 사람 딕셔너리를 초기화 reports = { x:0 for x in id_list}
- report를 set으로 만들어서 중복 신고 제거
- reports에 데이터 넣기
- reports 에서 벨류가 k 이상이면 인덱스를 활용하여 리스트에서 해당 인덱스 찾아서 +1
def solution(id_list, report, k):
answer = []
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) | 2025.09.20 |
|---|---|
| [해시] 메뉴 리뉴얼 (0) | 2025.09.19 |
| [프로그래머스] 베스트 앨범 (0) | 2025.09.16 |
| [프로그래머스] 오픈채팅방 (0) | 2025.09.15 |
| [프로그래머스] 할인행사 (0) | 2025.06.26 |