문제
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 |