본문 바로가기
알고리즘/프로그래머스

프로그래머스 Lv1 신고 결과 받기(python)

by 개발하는 호랑이 2024. 1. 29.

신고 결과 받기

 

 

풀이

2022 KAKAO BLIND RECRUITMENT 문제로 일반적인 lv1 문제보단 복잡하긴 하다.
내가 풀이를 하면서 중점으로 본 것은 문제를 해결하면서 변수가 꼬이지 않게 하는 것이었다.
id_number 대신 index를 사용해서 확인해도 되었으나, 개인적으로 이게 덜 헷갈릴 거라 생각했기에 이렇게 작성을 하고 이용했다.

순서대로
1. 한 유저가 다른 한 유저를 여러 번 신고해도 1번의 신고로 인정되기에 중복 제거
2. 유저별 id번호 기입
3. 각 유저의 신고받은 횟수 기입
4. 신고받은 횟수가 K번 이상일 경우, 그 유저를 신고한 유저에게 메일 보내기
5. 총 메일 받은 횟수를 answer에 기입

위의 5가지 과정으로 위 문제를 풀었고, 아래처럼 풀이했다.

# 신고 k번 이상이면 신고당한 유저 정지
# 한사람이 한 유저에게 신고가 여러번이면 그 신고는 1회
# 내 신고로 유저가 정지되면, 나에게 해당 유저 정지되었음을 메일로 전송.

def solution(id_list, report, k):
    answer = []
    # 한 유저 대상으로 한 사람이 여러번 신고해도 1번으로 치니 중복 제거
    report = list(set(report))
    # 각 유저별 id번호 기입해놓기
    id_number = {}
    id_mail = {}
    Reported_user = {}
    for id in range(len(id_list)):
        id_number[id_list[id]] = 0
        id_mail[id_list[id]] = 0
        Reported_user[id_list[id]] = 0
    # 신고당한 유저는 몇번 신고당했나
    for i in range(len(report)):
        report_person = list(map(str, report[i].split()))
        Reported_user[report_person[1]] += 1
    # k번 이상 신고당한 유저 찾기
    for j in range(len(report)):
        report_person = list(map(str, report[j].split()))
        # k번 이상 신고당했으면 정지니까, 신고한 사람에게 메일 보내기
        if Reported_user[report_person[1]] >= k:
            id_mail[report_person[0]] += 1
    for id in id_list:
        answer.append(id_mail[id])
    return answer

다른 사람 풀이

다른 사람은 아래처럼 풀었다.

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