개인적으로 코딩테스트 연습을 하고 풀이과정을 적으려고 합니다.
문제는 아래 링크를 가서 확인하시면 됩니다.
프로그래머스-신고결과받기
(출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges)
입력은 id가 들어있는 id_list(리스트)와 신고정보가 들어가있는 report(리스트)가 들어옵니다. 신고정보는 "<이용자id> <신고자id>"로 한 칸 떨어진 형태 입니다.
출력은 id_list의 담긴 id 순서대로 신고한 유저가 메일을 받은 수를 담아서 return 합니다.
입력으로 받은 내용을 아래와 같은 형태의 데이터로 변경합니다. 신고자id는 리스트내 리스트 형태로 구현합니다.
이용자id | 신고자id |
---|---|
id1 | [id2, ..] |
id2 | [ ] |
신고자 id의 개수가 k값 이상이라면 이용정지id로 판정합니다.
이용자id | 신고자id | 이용정지여부 |
---|---|---|
id1 | [id2, ..] | True |
id2 | [ ] | False |
이용정지한 id의 신고자id를 세어 메일이 발송된 횟수를 확인합니다.
key를 이용자id로 빈 리스트를 value로 딕셔너리를 생성합니다.
report_dic = {}
for userId in id_list:
report_dic[userId] = []
입력받은 report 리스트를 처리하기 위해 for문을 사용했으며, 각 아이템은 공백으로 구분되어진 문자열 이므로 split으로 처리.
신고받은 userId의 딕셔너리에 reptID가 없으면 리스트에 추가
for str in report:
reptId, userId = str.split()
if reptId not in report_dic[userId]:
report_dic[userId].append(reptId)
stop_dic 딕셔너리를 id_list를 key로 만들어 신고한 사용자가 입력받은 k값 이상일 경우, True 미만이면 False를 입력
stop_dic = {}
for userId in id_list:
if len(report_dic[userId]) >= k:
stop_dic[userId] = True
else:
stop_dic[userId] = False
mail_list를 만들어 stop_dic이 True인 이용자id의 신고자id를 추가함.
mail_list = []
for userId in id_list:
if stop_dic[userId]:
mail_list += report_dic[userId]
answer에 id_list 순서대로 신고자id 메일 갯수를 세어 추가한 후 return
answer = []
for userId in id_list:
answer.append(mail_list.count(userId))
return answer
def solution(id_list, report, k):
answer = []
# 이용자id에 대한 신고자id 리스트를 딕셔너리로 생성
report_dic = {}
for userId in id_list:
report_dic[userId] = []
# report 리스트의 문자열을 split 하여 신고자id 딕셔너리에 없을 경우 추가
for str in report:
reptId, userId = str.split()
if reptId not in report_dic[userId]:
report_dic[userId].append(reptId)
# 이용정지여부 딕셔너리 생성
# 신고자id의 갯수가 k를 넘을 경우 True 아니면 False
stop_dic = {}
for userId in id_list:
if len(report_dic[userId]) >= k:
stop_dic[userId] = True
else:
stop_dic[userId] = False
# 이용이 정지된 이용자id의 신고자id 에게 메일 발송
# 이용정지여부 딕셔너리가 True일 경우 신고자id 리스트를 mail_list에 추가
mail_list = []
for userId in id_list:
if stop_dic[userId]:
mail_list += report_dic[userId]
# answer에 id_list 순서대로 신고자id 메일 갯수를 세어 추가한 후 return
for userId in id_list:
answer.append(mail_list.count(userId))
return answer