[파이썬 코딩테스트] 11.신고 결과 받기 - 프로그래머스

링크

내 풀이(O)

  • 신고 대상을 key로, 신고한 유저의 이름들을 value로 갖는 dictionary를 만든다 => id_dict
  • value의 길이가 정지기준(k)를 넘는 경우의 신고한 유저들의 배열을 만든다 => over_k
  • flat한 리스트에서 각 유저의 개수를 구한다
import itertools

def solution(id_list, report, k):
    id_dict = { id: [] for id in id_list }
    for r in set(report):
        [sub, obj] = r.split(' ')
        id_dict[obj] += [sub]

    over_k = [sub for sub in id_dict.values() if (len(sub) >= k)]
    flat_list = list(itertools.chain(*over_k))

    return [flat_list.count(id) for id in id_list]

다른 풀이

  • 유저 id를 key로, 신고당한 횟수를 value로 가지는 dictionary를 만든다
  • 신고당한 횟수가 정지기준을 넘은 경우의 신고한 유저들의 index를 찾아 1씩 더해준다
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

검증용 코드

id_list = [["muzi", "frodo", "apeach", "neo"], ["con", "ryan"]]
report = [["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"], ["ryan con", "ryan con", "ryan con", "ryan con"]]
k = [2, 3]
result = [[2,1,1,0], [0,0]]

for idx in range(len(result)):
    print(idx, '성공' if solution(id_list[idx], report[idx], k[idx]) == result[idx] else "실패")

links

social