320x100
https://school.programmers.co.kr/learn/courses/30/lessons/92334
조금 헷갈릴 수 있는데, id_list로 사용자들의 이름이 들어오기 때문에 리스트의 인덱스를 쓰기 보다는 딕셔너리를 사용하는 것이 낫다고 생각되었다.
두 가지 딕셔너리가 필요했다.
- reported : user별 신고당한 횟수를 세기 위한 딕셔너리. key - user id, value - reported counts.
- report_list : user별 신고한 user를 모아 놓은 리스트를 value로 가지는 딕셔너리. key - user id, value - report users.
report 내 신고 내역을 돌면서, 신고 횟수를 reported에 추가하고 report_list[신고한 유저]에 신고당한 유저를 추가한다.
그리고 k 이상 신고당한 유저를 따로 ban_list에 추가하고, ban_list 내 b가 report_list[id_list[i]]에 있으면 answer[i]를 증가시킨다.
중요한 점은 user1 -> user2에 대한 여러 번의 신고는 하나의 신고로 치기 때문에, set() 함수를 이용하여 중복을 지워 주어야 한다.
from collections import defaultdict # 각 index에 값을 미리 할당하지 않아도 된다 !!
def solution(id_list, report, k):
answer = [0] * len(id_list) # user id수만큼 리스트 생성
report = set(report) # user1 -> user2에 대한 여러 번의 신고는 하나로 간주. set()를 통해 중복 제거
reported = defaultdict(int) # key - user id, value - reported counts.
report_list = defaultdict(list) # key - user id, value - report users.
ban_list = [] # k회 이상 신고되어 정지된 user list
for r in report:
user1, user2 = r.split(' ')
reported[user2] += 1 # 신고당한 user는 reported 횟수 추가
report_list[user1].append(user2) # report_list[user1]에 user2를 추가.
if reported[user2] == k: # banned user
ban_list.append(user2)
for b in ban_list: # ban list check
for i in range(len(id_list)): # 모든 user를 check
if b in report_list[id_list[i]]: # ban user가 report_list에 있으면 Mail.
answer[i] += 1
return answer
1단계 문제라지만 결코 만만치 않았다. 딕셔너리를 많이 다뤄 보지 않아서 2개의 딕셔너리를 생각하기 어려웠고, set() 함수같은 것도 검색해서 처음 사용해 보았기 때문에.. 그래도 defaultdict 같은 모듈은 차후 유용하게 써먹을 것 같다. 화이팅!
'코딩테스트' 카테고리의 다른 글
[파이썬] 크레인 인형뽑기 게임 - 2019 카카오 개발자 겨울 인턴십 [CODING TEST #6] (0) | 2022.07.19 |
---|---|
[파이썬] 없는 숫자 더하기 - 프로그래머스 월간 코드 챌린지 시즌3 [CODING TEST #5] (0) | 2022.07.19 |
[파이썬] 숫자 문자열과 영단어 - 2021 카카오 채용연계형 인턴십 [CODING TEST #4] (0) | 2022.07.19 |
[파이썬] 내적 [CODING TEST #2] (0) | 2022.07.18 |
[파이썬] 직사각형 별찍기 [CODING TEST #1] (0) | 2022.07.18 |
댓글