본문 바로가기

알고리즘/카카오 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' 카테고리의 다른 글

키패드 누르기 (Level 1)  (0) 2022.05.26
숫자 문자열과 영단어 (Level 1)  (0) 2022.05.25
오픈채팅방 (Level 2)  (0) 2022.05.24
문자열 압축 (Level 2)  (0) 2022.05.23
신규 아이디 추천 (Level 1)  (0) 2022.05.23