728x90
코딩테스트 연습 - 신고 결과 받기 | 프로그래머스 스쿨 (programmers.co.kr)
이틀 연속 카카오 문제..
카카오 문제의 특징이 보편적으로 그런지는 모르겠지만,
지문이 길다 보니 지문 속에서 함수 힌트를 제공한다.
# 팀원끼리 풀어본 문제
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]] # try/except 문 사용
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
# 다른 사람의 코드
from collections import defaultdict # 핵심
def solution(id_list, report,k):
answer = []
# 중복 신고 제거
report = list(set(report))
# user별 신고한 id 저장
user = defaultdict(set)
# user별 신고당한 횟수 저장
cnt = defaultdict(int)
for r in report:
# report의 첫번째 값은 신고자id, 두번째 값은 신고당한 id
a,b = r.split()
# 신고자가 신고한 id 추가
user[a].add(b)
# 신고당한 id의 신고 횟수 추가
cnt[b] += 1
for i in id_list:
result = 0
# user가 신고한 id가 k번 이상 신고 당했으면, 받을 메일 추가
for u in user[i]:
if cnt[u]>=k:
result +=1
answer.append(result)
return answer
defaultdict 클래스의 생성자로 기본값을 생성해주는 함수를 넘기면,
모든 키에 대해서 값이 없는 경우 자동으로 생성자의 인자로 넘어온 함수를 호출하여 그 결과값으로 설정함.
동시에 사전의 기본값 처리 코드를 제거할 수 있어서 편함.
'cording test' 카테고리의 다른 글
Lv.0 코드 처리하기 (0) | 2023.05.20 |
---|---|
Lv.1 체육복 (0) | 2023.05.20 |
Lv.1 신규 아이디 추천 (0) | 2023.05.17 |
LV.2 영어 끝말잇기 (0) | 2023.05.07 |
LV.1 기사단원의 무기 (0) | 2023.05.07 |