Notice
Recent Posts
Recent Comments
Link
아는 만큼 보인다
[프로그래머스] 신고결과 받기 python3 본문
프로그래머스 신고결과 받기 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가 있었다!
'알고리즘&자료구조 > 코딩테스트 연습' 카테고리의 다른 글
[프로그래머스] 로또의 최고 순위와 최저 순위 python3 (1) | 2022.06.16 |
---|---|
[프로그래머스] 숫자 문자열과 영단어 python3 (1) | 2022.06.11 |
[프로그래머스] H-index python3 (0) | 2022.06.11 |
[프로그래머스] K번째수 python3 (0) | 2022.06.11 |
[프로그래머스] 완주하지 못한 선수 python3 (0) | 2022.06.11 |