[프로그래머스] 신고 결과 받기 문제풀이 python

mauz·2022년 5월 5일
0

🐒 신고 결과 받기

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으로 신고들의 중복을 제거한다음 딕셔너리에 값을 저장했다.

profile
쥐구멍에 볕드는 날

0개의 댓글