본문 바로가기
Programmers Coding-Test

[Python] 2022 KAKAO BLIND RECRUITMENT : 신고 결과 받기

by 으녜 2022. 3. 5.
728x90

https://programmers.co.kr/learn/courses/30/lessons/92334

 

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

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

programmers.co.kr

 


💡 문제 

 

신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.

 

  • 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
    • 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
    • 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
  • K번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
    • 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.

 

이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 K가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.

 

 

 

[입출력 예]

#1

- frodo가 muzi, apeach에게 신고를 당해 2번(=k)의 신고 횟수를 초과하였으므로, muzi, apeach에게 신고 결과 알림이 간다.

- neo가 frodo, muzi에게 신고를 당해 2번(=k)의 신고 횟수를 초과하였으므로, muzi, frodo에게 신고 결과 알림이 간다.

- muzi가 apeach에게 신고를 당했지만 총 신고 횟수가 k를 넘지 않았으므로, 신고 결과 알림이 가지 않는다.

: 따라서 muzi 2번, frodo 1번, apeach 1번, neo 0번의 결과 메일을 받는다.

 

#2

- con이 총 4번 신고를 당했지만 동일 유저 ryan에게 신고가 되었으므로 신고 횟수 1회로 처리되어 k(=3)을 넘지 않아 메일을 받지 못한다.

 

 

[ 첫 번째 Python Code 👩🏻‍💻 ]

def solution(id_list, report, k):
    user_id = []
    red_user = []
    notice = {}
    new_report = set(report)
    new_report = list(new_report)

    for i in range(len(id_list)):
        notice[id_list[i]] = 0
    for i in range(len(new_report)):
        user_id.append(new_report[i].split()[0])
        red_user.append(new_report[i].split()[1])
    for i in range(len(red_user)):
        if(red_user.count(red_user[i])>=k):
            notice[user_id[i]] +=1
    
    return list(notice.values())

몇 개의 케이스에서 시간 초과가 떠 66.7%의 정확성으로 실패했다...😂

 

 

 

[ 두 번째 Python Code 👩🏻‍💻 ]

 

def solution(id_list, report, k):
    user_id = {i:0 for i in id_list}
    red_user = {i:0 for i in id_list}
    new_report = []
    
    report = list(set(report))
    
    for i in range(len(report)):
        new_report.append(report[i].split())
    
    for i in new_report:
        red_user[i[1]] +=1
        
    for i in red_user:
        if(red_user[i]>=k):
            for j in new_report:
                if(j[1]==i):
                    user_id[j[0]] +=1
                    
    return list(user_id.values())

Code Review >

 

1. 결과 알림을 받을 딕셔너리와 신고된 횟수를 count 할 딕셔너리를 만든다.

2. 입출력 예2와 같이 동일 유저가 신고할 케이스를 고려해 set으로 중복을 제거한 후 list로 다시 변환한다.

3. 공백을 기준으로 신고자와 신고된 자를 나눠 new_report에 저장한다.

4. 신고된 횟수를 red_user에 저장한다.

5. 신고된 횟수가 k와 같거나 크면 new_report에 저장된 신고자를 찾아 결과 알림을 받을 딕셔너리에 +1을 해준다.

 

 

드디어 성공‼️

 

 

 

카카오 코딩테스트라 그런지 level 1 단계도 나에겐 너무나 어렵다,,,😂

728x90