알고리즘/프로그래머스

[프로그래머스, 파이썬, 구현] 신고 결과 받기

미소여우 2022. 5. 9. 11:15
728x90

사실 계속 스프링만 계속 파고 싶지만, 현실적으로는 코딩테스트도 준비해야기에 나름 꾸준히 풀어보고 있다.

친구가 한 문제씩 제시해줘서 풀고있는데, 문자열도 잘 다룰 줄 알아야하기에 다음 문제를 풀어 보았다.

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

신고횟수가 k이상일 때 신고자에게 신고 되었다고 알려주어야 한다.

문제를 보고 나서 클래스를 활용해서 사용자마다 상태를 유지해주는게 좋을거 같아 아래와 같이 구성해보았다.

from collections import OrderedDict


class User:
    def __init__(self, username="", idx=0):
        self.idx = idx
        self.username = username
        self.count = 0
        self.report_list = []

    def __str__(self):
        return f"{self.username} {self.count} {self.report_list}"

    def __repr__(self):
        return f"{self.username} {self.count} {self.report_list}"


def solution(id_list, report, k):
    answer = [0] * len(id_list)
    user_dict = OrderedDict()
    for idx, user in enumerate(id_list):
        user_dict[user] = user_dict.get(user, User(user, idx))

    for r in report:
        reporting_user, reported_user = r.split(" ")
        if reporting_user in user_dict[reported_user].report_list: continue
        user_dict[reported_user].report_list.append(reporting_user)
        user_dict[reported_user].count += 1

    for key, user in user_dict.items():
        if user.count >= k:
            for reporting_user in user.report_list:
                answer[user_dict[reporting_user].idx] += 1
    return answer

이미 신고받은 유저는 카운트 안 되게 continue같은 처리도 필요하다.

728x90