Python/Coding Test

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

semperparatus 2024. 2. 14. 09:51

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


코드

def solution(id_list, report, k):

    cnt = [0] * len(id_list) # 각 유저별 신고 당한 횟수 카운트
    up_list = [] # k번 이상 신고 받은 유저 id 리스트
    result = [0] * len(id_list)
    
    report = list(set(report)) # 중복 신고 제거
    
    # 각 유저별 신고 당한 횟수 카운트
    for name in report:
        give, receive = name.split()
        cnt[id_list.index(receive)] += 1
    
    # k번 이상 신고 받은 유저 id 리스트
    for idx, num in enumerate(cnt):
        if num >= k:
            up_list.append(id_list[idx])
            
    # 각 유저가 받은 결과 메일 수 
    for name in report:
        give, receive = name.split()
        if receive in up_list:
            result[id_list.index(give)] += 1
    
    return result

풀이

 해당 문제를 풀 때 키 포인트는 중복 신고를 제거하기 위해 신고 정보 목록인 report를 set -> list 해주어야 한다 (집합 set은 중복 원소를 허용하지 않기 때문에). 또한 index 함수를 잘 활용해서 찾고자 하는 문자열의 인덱스를 반환해야 한다. 문제를 풀면서 크게 어려운 점은 없었지만 코드 작성 후 가독성 향상을 위해 다른 풀이도 살펴보았다.

 

다른 코드 & 풀이

def solution(id_list, report, k):

    cnt_dic = {i:0 for i in id_list} # 신고 받은 횟수
    result = [0] * len(id_list)
    
    # 신고 받은 횟수 카운트
    for name in set(report):
        cnt_dic[name.split()[1]] += 1
        
    # 각 유저가 받은 결과 메일 수 카운트
    for name in set(report):
        if cnt_dic[name.split()[1]] >= k:
            result[id_list.index(name.split()[0])] += 1
    
    return result

 

리스트를 여러 개 생성하지 않고 key를 id로, value를 신고 받은 횟수로 하는 딕셔너리를 생성해서 훨씬 가독성이 높은 코드를 완성할 수 있었다. 딕셔너리는 어떤 문제에서든 유용하게 사용할 수 있으니 사용법을 명확하게 익히고 자주 활용해보도록 해야겠다.