신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다.
유저 ID | 유저가 신고한 ID | 설명 |
---|---|---|
"muzi" | "frodo" | "muzi"가 "frodo"를 신고했습니다. |
"apeach" | "frodo" | "apeach"가 "frodo"를 신고했습니다. |
"frodo" | "neo" | "frodo"가 "neo"를 신고했습니다. |
"muzi" | "neo" | "muzi"가 "neo"를 신고했습니다. |
"apeach" | "muzi" | "apeach"가 "muzi"를 신고했습니다. |
각 유저별로 신고당한 횟수는 다음과 같습니다.
유저 ID | 신고당한 횟수 |
---|---|
"muzi" | 1 |
"frodo" | 2 |
"apeach" | 0 |
위 예시에서는 2번 이상 신고당한 "frodo"와 "neo"의 게시판 이용이 정지됩니다.
이때, 각 유저별로 신고한 아이디와 정지된 아이디를 정리하면 다음과 같습니다.
유저 ID | 유저가 신고한 ID | 정지된 ID |
---|---|---|
"muzi" | ["frodo", "neo"] | ["frodo", "neo"] |
"frodo" | ["neo"] | ["neo"] |
"apeach" | ["muzi", "frodo"] | ["frodo"] |
"neo" | 없음 | 없음 |
따라서 "muzi"는 처리 결과 메일을 2회, "frodo"와 "apeach"는 각각 처리 결과 메일을 1회 받게 됩니다.
이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때,
각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.
id_list | report | k | result |
---|---|---|---|
["muzi", "frodo", "apeach", "neo"] | ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"] | 2 | [2,1,1,0] |
["con", "ryan"] | ["ryan con", "ryan con", "ryan con", "ryan con"] | 3 | [0,0] |
입출력 예 #1
입출력 예 #2
k번 신고를 받은 유저는 정지를 당한다.
정지당한 유저를 신고한 유저는 정지 사실을 메일로 받는다.
유저별로 정지 처리한 메일을 받는 횟수를 리스트로 받는 함수를 생성한다.
def solution(id_list, report, k):
count = [0 for i in range(len(id_list))]
answer = [0 for i in range(len(id_list))]
new = []
out_name = []
for i in report:
j,h= i.split(' ')
count[id_list.index(h)] += 1
if count[id_list.index(h)] == 2:
out_name.append(h)
for i in report:
j,h = i.split(' ')
if h in out_name:
answer[id_list.index(j)] += 1
return answer
테스트 코드의 2번을 실패함
한사람이 다른 한사람을 여러번 신고하는경우를 한번 신고한것으로 처리하는 방법이 부재
리스트를 집합으로 변경한다면 리스트 내의 중복을 제거해서 여러번 신고에 대한 처리가 가능할것으로 접근
def solution(id_list, report, k):
count = [0 for i in range(len(id_list))]
answer = [0 for i in range(len(id_list))]
new = []
out_name = []
for i in set(report):
j,h= i.split(' ')
count[id_list.index(h)] += 1
if count[id_list.index(h)] == 2:
out_name.append(h)
for i in set(report):
j,h = i.split(' ')
if h in out_name:
answer[id_list.index(j)] += 1
return answer
테스트 코드는 다 맞췄지만 제출 문제는 2문제만 맞춤
딕셔너리로 접근해보자
딕셔너리의 벨류값을 리스트로 넣어서 리스트의 길이가 k 이상인 경우를 찾아 리스트 속의 사람들에게 메일을 보낸다
def solution(id_list, report, k):
report = list(set(report))
dic = {}
answer = [0 for i in range(len(id_list))]
for i in report:
j,w = i.split(' ')
if w in dic:
app =dic[w][:]
app.append(j)
dic[w] = app
else:
dic[w] = [j]
for i in dic.keys():
if len(dic[i]) >= k:
for j in dic[i]:
answer[id_list.index(j)] += 1
return answer