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 단계도 나에겐 너무나 어렵다,,,😂
'Programmers Coding-Test' 카테고리의 다른 글
[Python] 위클리 챌린지 : 부족한 금액 계산하기 (0) | 2022.03.06 |
---|---|
[Python] 2021 카카오 채용연계형 인턴십 : 숫자 문자열과 영단어 (0) | 2022.03.05 |
[Hash] 전화번호 목록 (0) | 2022.03.03 |
[Python] 2020 카카오 인턴십 : 키패드 누르기 (0) | 2021.05.19 |
[Python] 2018 KAKAO BLIND RECRUITMENT : [1차] 비밀지도 (0) | 2021.05.18 |