본문 바로가기
문제 풀이/프로그래머스 (Programmers)

[Python] 프로그래머스 : 신고 결과 받기

by 희조당 2022. 6. 18.
728x90

https://programmers.co.kr/learn/courses/30/lessons/92334

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr


 문제 풀이

딕셔너리 result는 키와 값을 다음과 같이 가진다.

key (사용자 id) : value [[신고한 유저, ], 신고받은 횟수, 받을 메일] 

result를 이용해 전체적인 값을 정리했고 이후 확인하는 작업만 하면된다.

set의 특징을 이용해서 중복 신고를 없애서 신고들을 걸렀다.

 느낀점

코딩 테스트를 대비해서 파이썬으로 시작해보았다. 아직 문법이 많이 익숙하지 않고, 알고리즘을 오랜만에 하다보니 생각보다 훨씬 어렵게 푸는 것 같았다. 꾸준하게만 하자..!!

고수들의 코드를 보니까 매우 충격적이었다... 알고리즘의 매력..?

 1. index 함수를 이용해서 answer 리스트의 정확한 위치에 값을 추가 시키는 점

 2. 쓸 데 없는 추가 구현과 반복이 없다는 점

 

내 코드는 굳이 딕셔너리를 초기화해서 반복문에서 값을 구하고

또 반복문을 돌려서 정지될 유저를 찾고

또 거기서 반복문을 돌려서 정지대상이 신고대상 리스트에 있을 때 값을 정산한ㄷㅏ.. 얼마나 비효율적인지...

갈 길이 많이 멀었다.

내 코드

def solution(id_list, report, k):
    answer = []
    result = {}
    fbd_user = []

    for id in id_list:
        result[id] = [[], 0, 0]
    
    for case in set(report):
        result[case.split()[0]][0].append(case.split()[1])
        result[case.split()[1]][1] += 1    

    for user in id_list:
        if result[user][1] >= k:
            fbd_user.append(user)

    for user in id_list:
        for forbidden in fbd_user:
            if forbidden in result[user][0]:
                result[user][2] += 1
        answer.append(result[user][2])

    return answer

 

 고수의 코드

def solution(id_list, report, k):
    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

댓글