개인적으로 코딩테스트 연습을 하고 풀이과정을 적으려고 합니다.

문제

문제는 아래 링크를 가서 확인하시면 됩니다.
프로그래머스-신고결과받기
(출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges)

어떻게 풀어나갈까?

입출력 분석

입력은 id가 들어있는 id_list(리스트)와 신고정보가 들어가있는 report(리스트)가 들어옵니다. 신고정보는 "<이용자id> <신고자id>"로 한 칸 떨어진 형태 입니다.

출력은 id_list의 담긴 id 순서대로 신고한 유저가 메일을 받은 수를 담아서 return 합니다.

프로그램으로 구현할 내용

  1. 입력으로 받은 내용을 아래와 같은 형태의 데이터로 변경합니다. 신고자id는 리스트내 리스트 형태로 구현합니다.

    이용자id신고자id
    id1[id2, ..]
    id2[ ]
  2. 신고자 id의 개수가 k값 이상이라면 이용정지id로 판정합니다.

    이용자id신고자id이용정지여부
    id1[id2, ..]True
    id2[ ]False
  3. 이용정지한 id의 신고자id를 세어 메일이 발송된 횟수를 확인합니다.

파이썬으로 구현

1. 이용자id에 대한 신고자id 리스트를 딕셔너리로 생성

key를 이용자id로 빈 리스트를 value로 딕셔너리를 생성합니다.

report_dic = {}
for userId in id_list:
	report_dic[userId] = []

2. report 리스트의 문자열을 split 하여 신고자id 딕셔너리에 없을 경우 추가

입력받은 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)

3.이용정지여부 딕셔너리 생성

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

4. 이용이 정지된 이용자id의 신고자id 에게 메일 발송

mail_list를 만들어 stop_dic이 True인 이용자id의 신고자id를 추가함.

mail_list = []
for userId in id_list:
	if stop_dic[userId]:
		mail_list += report_dic[userId]

5. 결과값 return

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
profile
다시 도약하려 노력해보자

0개의 댓글