알고리즘&자료구조/코딩테스트 연습
[프로그래머스] 신고결과 받기 python3
계토
2022. 6. 11. 15:57
프로그래머스 신고결과 받기 python3 문제 바로가기
코딩테스트 연습 - 신고 결과 받기
문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의
programmers.co.kr
처음에 작성했던 코드는 다음과 같다. 그냥 되는대로 복잡하게 생각한 것.
def solution(id_list, report, k):
# k 정지 기준이 되는 신고 횟수
# count 신고횟수 {신고된 사람: 신고된 횟수}
# l 신고 리스트 {신고한 사람:[신고된 사람]}
count = dict()
l = dict()
answer = []
who_stopped = [] # 정지된 사람 리스트 # 정지 메일
# initialization
for i in range(len(id_list)):
count[id_list[i]] = 0 # 각 사람마다 신고된 횟수를 count하기 위함
l[id_list[i]] = [] # 신고한 사람에 신고된 사람 리스트를 만들어주기 위함
answer.append(0) # 실제 mail count
# report에서 신고리스트, 횟수 불러오기
for r in report:
do, done = r.split()
if done not in l[do]: # 두번 신고한 경우 제외
count[done] +=1
l[do].append(done)
# 정지된 사람 목록만들기
for i in range(len(id_list)):
if count[id_list[i]] >= k:
who_stopped.append(id_list[i])
# 메일 보내기 (횟수 count)
for i in range(len(id_list)):
for stopped in l[id_list[i]]: # 신고한 사람: [신고된 사람]
if stopped in who_stopped:
answer[i] += 1
return answer
이해할 수 있는 것 위주로 다른 사람들의 코드를 참고하여 좀 더 간단하게 만들어 본 것.
def solution(id_list, report, k):
# k 정지 기준이 되는 신고 횟수
# l 신고 리스트 {신고된 사람:[신고한 사람]} 원래는 {신고한 사람:[신고된 사람]}
# initialization
# For loop 돌리는 것은 똑같지만, 코드가 그래도 좀 더 간단해짐
l = {x:[] for x in id_list}
mail = {x:0 for x in id_list}
answer = [0] * len(id_list)
for r in set(report): # set으로 바꿔주면 중복된 신고를 바로 제거할 수 있음
do, done = r.split()
l[done].append(do)
for id in id_list:
if len(l[id]) >= k: # count를 별도로 쓰지 않고 바로 len으로 count
for dos in l[id]:
mail[dos] += 1 # mail count를 dictionary에 쌓아줌
for i in range(len(id_list)):
answer[i] = mail[id_list[i]] # 바로 answer에 넣어줌.
return answer
저장되는 정보의 개수가 줄었고, 실제로 실행 속도가 1/10 까지 줄어든 test case가 있었다!