연습장

26. 신고 결과 받기 본문

프로그래머스/1단계

26. 신고 결과 받기

js0616 2024. 1. 22. 16:46

 

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