연습장
26. 신고 결과 받기 본문
id_list : 회원 목록
report : ["신고자 신고대상", ... ]
k : k번 이상 일 경우 정지
result : id_list 에 보내는 메일
메일은 정지 된 대상에 대해서 신고한 사람 , 신고 당한 대상 에게 보내진다.
frodo 와 neo 가 신고를 k= 2 번 이상 당했으므로 정지가 되며
정지가 된 대상을 신고한 신고자에게 메일이 1개씩 가게됨.
muzi 의 경우 frodo 에 대한 메일 1개와 neo 에 대한 메일 1개 총 2개를 받게된다.
frodo 의 경우 neo 에 대한 메일 1개를 받는다.
apeach 의 경우 frodo 에 대한 메일 1개를 받는다.
neo 의 경우 받지않는다.
본인이 본인을 신고하지 않으며, 같은 대상에 대해서 여러번 신고하더라도 1건으로 처리된다.
1. report 중복제거
2. 누가 정지 당했는지?
3. 누가 신고했는지 ?
4. 메일 횟수
def solution(id_list, report, k):
answer = []
# 중복제거
report = list(set(report))
id_dic = {}
# 유저별 신고당한 횟수
for i in id_list:
id_dic[i] = 0
for i in report:
id_dic[i.split(' ')[1]] += 1
print(id_dic)
return answer
다음과 같이 유저별로 신고 당한 횟수가 나오게되며
이 당한 횟수가 k 이상일 경우 정지가 되며 신고자에게 메일이 가게된다.
def solution(id_list, report, k):
answer = []
# 중복제거
report = list(set(report))
# 유저별 신고당한 횟수
id_dic = {}
mail_dic = {} # 메일 받는곳
for i in id_list:
id_dic[i] = 0
mail_dic[i] = 0
for i in report:
id_dic[i.split(' ')[1]] += 1
# k 이상인 경우
filter_dic= filter(lambda e: e[1] >= k, id_dic.items())
filter_dic = dict(filter_dic)
# 신고자 확인
for id_ban in filter_dic:
for i in report:
if id_ban == i.split(' ')[1] :
mail_dic[i.split(' ')[0]] += 1
for i in mail_dic:
answer.append(mail_dic[i])
return answer
이렇게 또 시간초과에 걸리게 된다.
report 는 순서가 상관없기 때문에 정렬 해주었다.
report.sort() 로 정렬해서 속도를 조금 올릴수있었다.
아래서부터 주석처리 해본 결과
def solution(id_list, report, k):
answer = []
# 중복제거
report = list(set(report))
report.sort()
# 유저별 신고당한 횟수
id_dic = {}
mail_dic = {} # 메일 받는곳
for i in id_list:
id_dic[i] = 0
mail_dic[i] = 0
for i in report:
id_dic[i.split(' ')[1]] += 1
# k 이상인 경우
filter_dic= filter(lambda e: e[1] >= k, id_dic.items())
filter_dic = dict(filter_dic)
# # 신고자 확인
# for id_ban in filter_dic:
# for i in report:
# if id_ban == i.split(' ')[1] :
# mail_dic[i.split(' ')[0]] += 1
# for i in mail_dic:
# answer.append(mail_dic[i])
return answer
신고자를 확인하는 로직을 주석처리했을때 속도가 향상된걸로 보아서 이 부분을 수정해보겠다.
시간 초과가 아닌 실패가 뜨는 모습
filter_dic 를 이용하여 신고 대상을
{'frodo': 2, 'neo': 2} |
처럼 저장하고 있는데
이름만 list 에 저장하고 in 을 사용하면 어떨까
def solution(id_list, report, k):
answer = []
ban_list = []
# 중복제거
report = list(set(report))
report.sort()
# 유저별 신고당한 횟수
id_dic = {}
mail_dic = {} # 메일 받는곳
for i in id_list:
id_dic[i] = 0
mail_dic[i] = 0
for i in report:
id_dic[i.split(' ')[1]] += 1
# k 이상인 경우
for i in id_dic:
if id_dic[i] >= k:
ban_list.append(i)
# 신고자 확인
for i in report:
if i.split(' ')[1] in ban_list:
mail_dic[i.split(' ')[0]] += 1
for i in mail_dic:
answer.append(mail_dic[i])
return answer
다음과 같이 수정하였다.
for 문으로 신고자에 대해서 한번씩 조회할때보다 in 을 이용하여 ban_list 에 신고자가 있으면 (누구인지는 상관 x ) 으로 로직을 바꾸니 속도가 향상 되는것을 확인 할 수 있다.
'프로그래머스 > 1단계' 카테고리의 다른 글
28. 가장 많이 받은 선물 (0) | 2024.01.22 |
---|---|
27. 붕대 감기 (0) | 2024.01.22 |
25. 공원 산책 (0) | 2024.01.22 |
24. 달리기 경주 (0) | 2024.01.22 |
23. 개인정보 수집 유효기간 (1) | 2024.01.22 |