https://programmers.co.kr/learn/courses/30/lessons/92334
def solution(id_list, report, k):
answer = [0]*len(id_list)
dic = dict()
for user in id_list:
dic[user] = [set(),0]
for i in report:
user, reported = i.split()
dic[reported][0].add(user)
print(dic.items())
for key,value in dic.items():
if len(value[0]) >= k:
for i in value[0]:
dic[i][1] += 1
for idx, user in enumerate(id_list):
answer[idx] = dic[user][1]
return answer
백준은 답을 출력해야하는데, 프로그래머스는 함수를 짜기까지만 한다. 신기
입력이
["muzi", "frodo", "apeach", "neo"],["muzi frodo","muzi frodo","muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"],2
이라면
한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다. 라고 명시 되어 있기 때문에 중복을 제거하는 과정이 필요하다.
set으로 중복을 제거하는 아이디어를 사용하여
딕셔너리에 다음처럼 저장한다.
dic = {
#유저 = [유저를 신고한 사람 리스트], 유저가 정지 맥인사람 수
'muzi' = ['apeach'], 0
'frodo' = ['apeach', 'muzi'] , 0
'apeach' = [''], 0
'neo' = ['frodo','muzi'], 0
}
이제 딕셔너리를 돌면서
유저를 신고한 사람 리스트의 길이가 k값 이상이면
유저를 신고한 사람이 정지맥인 사람 수를 1 추가한다
for key,value in dic.items():
if len(value[0]) >= k:
for i in value[0]:
dic[i][1] += 1
이제 answer 리스트에 순서대로 담기 위해
enumerate함수를 이용해서 인덱스와 유저명을 같이 불러온다.
id_list에 저장된 사람순서대로
그 유저가 정지맥인 사람이 몇명인지를 answer에 담는다.
for idx, user in enumerate(id_list):
answer[idx] = dic[user][1]
프로그래머스에서는 정답시 다른사람들의 코드를 살펴볼 수 있다.
그 중에서 다음 코드가 내가 풀이에 사용한 개념과 비슷한데 더 깔끔한 것 같다.
def solution(id_list, report, k):
answer = [0] * len(id_list)
dic_report = {id: [] for id in id_list} # 해당 유저를 신고한 ID
for i in set(report):
i = i.split()
dic_report[i[1]].append(i[0])
for key, value in dic_report.items():
if len(value) >= k:
for j in value:
answer[id_list.index(j)] += 1
return answer
출처
나는 딕셔너리에 빈set 를 생성해서 하나씩 입력을 받으면서 저장했지만
이 분은 set으로 신고들의 중복을 제거한다음 딕셔너리에 값을 저장했다.