내일배움캠프 AI/페어프로그래밍
[페어프로그래밍] 230517 신고 결과 받기 Lv.1 | set split dict
생각하는 코댕이
2023. 5. 17. 12:25
728x90
페어프로그래밍 결과 코드
'''
1. 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
-신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
-한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
2. k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
-유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
output : <list> 각 유저별로 처리 결과 메일을 받은 횟수
'''
# <1> 각 회원마다 신고한 유저의 이름을 파악, 누가 누구를 신고했을까! → key:value {신고자:피신고자}
# <2> 회원중에 신고횟수가 정지 수준에 도달한 유저의 명단
# <3> 각 회원마다 신고한 유저 중 정지된 유저의 명단
# <4> <3>번의 유저의 수를 카운트해서 list에 담아서 return하면 정답!
# 페어프로그래밍으로 제작한 코드
def solution(id_list, report, k):
note={}
banner=[]
for i in set(report):
a=i.split(" ")
try:
note[a[0]] += [a[1]]
except:
note[a[0]] = [a[1]]
banner.append(a[1])
print(note)
print(banner)
ban_report={} #신고당한 횟수를 저장할 딕셔너리
for i in id_list:
ban_report[i]=0
for ban in banner:
ban_report[ban] +=1 #신고당한 횟수 카운트
print(ban_report)
pause=[] # 정지대상을 저장할 리스트
for i in id_list:
if ban_report[i] >= k:
pause.append(i)
print(pause)
for i in id_list:
ban_report[i]=0
for key,value in note.items(): # 신고자: 피신고자 명단
for i in pause:
if i in value:
ban_report[key] +=1
answer = list(ban_report.values())
return answer
+전체 테스트용 코드
더보기
import os
os.system("cls")
# https://school.programmers.co.kr/learn/courses/30/lessons/92334
'''
1. 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
-신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
-한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
2. k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
-유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.
output : <list> 각 유저별로 처리 결과 메일을 받은 횟수
'''
# <1> 각 회원마다 신고한 유저의 이름을 파악, 누가 누구를 신고했을까! → key:value {신고자:피신고자}
# <2> 회원중에 신고횟수가 정지 수준에 도달한 유저의 명단
# <3> 각 회원마다 신고한 유저 중 정지된 유저의 명단
# <4> <3>번의 유저의 수를 카운트해서 list에 담아서 return하면 정답!
# ====================코딩 영역========================
def solution(id_list, report, k):
note={}
banner=[]
for i in set(report):
a=i.split(" ")
try:
note[a[0]] += [a[1]]
except:
note[a[0]] = [a[1]]
banner.append(a[1])
print(note)
print(banner)
ban_report={} #신고당한 횟수를 저장할 딕셔너리
for i in id_list:
ban_report[i]=0
for ban in banner:
ban_report[ban] +=1 #신고당한 횟수 카운트
print(ban_report)
pause=[] # 정지대상을 저장할 리스트
for i in id_list:
if ban_report[i] >= k:
pause.append(i)
print(pause)
for i in id_list:
ban_report[i]=0
for key,value in note.items(): # 신고자: 피신고자 명단
for i in pause:
if i in value:
ban_report[key] +=1
answer = list(ban_report.values())
return answer
# ====================리팩토링 영역========================
def solution(id_list, report, k):
report = set(report) # 중복된 신고 무시
ban_report={} #신고자 매칭
ban_count={} #신고당한 횟수
result={} #유저당 이메일 수신 횟수를 담을 딕셔너리
for i in id_list:
ban_report[i]=[]
ban_count[i]=0
result[i]=0
for i in report:
a=i.split(" ")
ban_report[a[0]] += [a[1]]
ban_count[a[1]] += 1
pause=[] # 정지대상을 저장할 리스트
for key,value in ban_count.items():
if value >= k: # 신고당한 횟수가 기준치 k를 넘긴다면 정지명단에 추가
pause.append(key)
for key,value in ban_report.items(): # 신고자: 피신고자 명단
for i in pause:
if i in value:
result[key] +=1
answer = list(result.values())
return answer
# ====================테스트 영역========================
id_list = ["muzi", "frodo", "apeach", "neo"]
report = ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]
k = 2
id_list1 = ["con", "ryan"]
report1 = ["ryan con", "ryan con", "ryan con", "ryan con"]
k1 = 3
print("[2,1,1,0] ▶ ",solution(id_list, report, k))
print("\n")
print("[0,0] ▶ ",solution(id_list1, report1, k1))
리팩토링 코드
# ====================리팩토링 영역========================
def solution(id_list, report, k):
report = set(report) # 중복된 신고 무시
ban_report={} #신고자 매칭
ban_count={} #신고당한 횟수
result={} #유저당 이메일 수신 횟수를 담을 딕셔너리
for i in id_list:
ban_report[i]=[]
ban_count[i]=0
result[i]=0
for i in report:
a=i.split(" ")
ban_report[a[0]] += [a[1]]
ban_count[a[1]] += 1
pause=[] # 정지대상을 저장할 리스트
for key,value in ban_count.items():
if value >= k: # 신고당한 횟수가 기준치 k를 넘긴다면 정지명단에 추가
pause.append(key)
for key,value in ban_report.items(): # 신고자: 피신고자 명단
for i in pause:
if i in value:
result[key] +=1
answer = list(result.values())
return answer
흠터레스팅 코드
# 1번 | 컴프리헨션 , 인덱싱
def solution(id_list, report, k):
answer = [0] * len(id_list)
reports = {x : 0 for x in id_list}
for r in set(report):
reports[r.split()[1]] += 1
for r in set(report):
if reports[r.split()[1]] >= k:
answer[id_list.index(r.split()[0])] += 1
return answer
시사점 or 새로이 알게된 점
컴프리헨싱&인덱싱 활용
answer = [0] * len(id_list)
# for문 대신 0을 부여한 빈 리스트를 선언 → 시간복잡도에서 효율↑
reports = {x : 0 for x in id_list}
# 컴프리헨션으로 <list> → <dict>으로 바로 변환
answer[id_list.index(r.split()[0])] += 1
# index를 활용해 dict같은 효과를 구현
728x90