본문 바로가기

알고리즘/카카오 EASY

신고 결과 받기 (Level 1)

문제

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

 

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

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

programmers.co.kr

 

내 풀이

1. report를 돌면서 유저와 유저가 신고한 ID를 리스트를 원소로 가지는 딕셔너리(defaultdict)에 담았다. 

dic = {"muzi": ["frodo", "neo"], "frodo": ["neo"], "apeach": ["frodo", "muzi"], "neo": []}

2. 딕셔너리에 담으면서 동시에 리스트(lst)를 사용하여 각 ID가 몇 번 신고당했는지 카운트를 세었다.

3. 완성된 딕셔너리(dic)를 돌면서 k번 이상 신고된 ID를 구하고, 그 ID를 신고한 유저의 인덱스에 카운트를 증가시켰다. (answer)

 

여기서 중요하게 사용된 함수는 리스트에서 원하는 값의 인덱스를 반환해주는 index 함수이다.

 

from collections import defaultdict

def solution(id_list, report, k):
    answer = [0]*len(id_list)
    dic = defaultdict(list)
    lst = [0]*len(id_list)
    for r in report:
        a, b = r.split()
        if b not in dic[a]:
            dic[a].append(b)
            lst[id_list.index(b)] += 1
    for key in dic:
        for name in dic[key]:
            if lst[id_list.index(name)] >= k:
                answer[id_list.index(key)] += 1
    return answer

 

다른 풀이

1. key가 ID이고 value가 0으로 초기화된 reports라는 딕셔너리를 만들었다.

2. report를 set으로 만들어 중복제거를 하였고, (나는 if문으로 중복을 제거했었다. report 전체를 set으로 만드는 것도 좋은 방법인 것 같다) 앞에서 만든 reports 딕셔너리를 통해 각 ID가 신고를 몇 번 받았는지 카운트를 세었다.

reports = {"muzi": 1, "frodo": 2, "apeach": 0, "neo": 2}

3. report를 돌면서 reports에서 value 값이 k 이상인 ID를 구하고, 그 ID를 신고한 유저의 인덱스의 카운트를 증가시켰다. (answer)

 

여기서 중요하다고 생각된 알고리즘은 두 번째 for문에서 report를 재사용했다는 것이다. 그럼으로써 신고한 유저의 이름을 나처럼 따로 저장하지 않았다. 훨씬 효율적인 것 같다.

 

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

 

총평

레벨 1이지만, 공부할 것이 많았다. 오늘도 문제를 통해 겸손함을 배운다.

'알고리즘 > 카카오 EASY' 카테고리의 다른 글