728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/92334
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
기본 로직을 잘 생각하고 코드를 짜는 연습을 했다.
생각해둔 로직을 반영해 풀어서 쓰고, 그 코드를 바탕으로 좀 더 간결하게 다듬었다.
1. 길게 풀어 쓴 코드
def solution(id_list, report, k) :
# report의 길이가 20만이므로 report 길이 N일 때 O(NlogN)까지 가능
# 리턴할 처리결과 메일은 유저가 신고한 대상 중 정지된 유저의 수
# 먼저 정지된 유저 목록을 구하고 > 유저 목록을 순회하며 해당 유저가 신고한 대상 중 정지된 유저의 수를 구함
# 1. report를 순회하면서 > (1) 신고한 유저, 신고당한 유저 정보 저장 (2) 신고당한 유저의 누적 신고 수 저장(최종 신고 수가 필요한 건 아니므로 신고 수 k 이상일 때부터는 count 안 해도 됨)
# 2. id_list를 순회하면서 > 해당 유저가 신고한 유저 중 정지된 유저 수를 저장
history = {} # { 신고한 유저명 : [신고당한 유저 목록] }
report_count = {} # { 신고당한 유저명 : 누적 신고 횟수 }
suspended = [] # 정지된 유저 목록
for i in report :
report_arr = i.split(" ")
reporter = report_arr[0]
obj = report_arr[1]
if reporter not in history or obj not in history[reporter] : # 신고자가 history에 없거나 신고자의 신고 목록에 대상이 없으면
history.setdefault(reporter, [ ]).append(obj) # 신고자의 신고 이력에 대상을 추가 (신고자의 신고 이력이 없으면 빈 배열 추가)
if obj not in suspended : # 신고 대상이 정지 목록에 없으면
report_count[obj] = report_count.get(obj, 0) + 1 # 신고당한 유저의 누적 신고 횟수 + 1
if report_count[obj] >= k : # 신고 대상의 누적 신고 수가 k를 넘으면
suspended.append(obj) # 신고 대상을 정지 대상 목록에 추가
answer = []
for user in id_list :
if user in history :
suspended_count = len(list(filter(lambda x : x in suspended and True or False, history[user]))) # 신고 대상 목록 중 정지된 유저 목록에 있는 유저 수
answer.append(suspended_count)
else :
answer.append(0)
return answer
2. 정리한 코드
위의 코드를 바탕으로 좀 더 간결하게 다듬었다.
def solution(id_list, report, k) :
# report의 길이가 20만이므로 report 길이 N일 때 O(NlogN)까지
# 리턴할 처리결과 메일은 유저가 신고한 대상 중 정지된 유저의 수
# 먼저 정지된 유저 목록을 구하고 > 유저 목록을 순회하며 해당 유저가 신고한 대상 중 정지된 유저의 수를 구함
# 1. report를 순회하면서 > (1) 신고한 유저, 신고당한 유저 정보 저장 (2) 신고당한 유저의 누적 신고 수 저장(최종 신고 수가 필요한 건 아니므로 신고 수 k 이상일 때부터는 count 안 해도 됨)
# 2. id_list를 순회하면서 > 해당 유저가 신고한 유저 중 정지된 유저 수를 저장
history = {x : [ ] for x in id_list} # { 신고한 유저명 : [신고당한 유저 목록] }
report_count = { x : 0 for x in id_list} # { 신고당한 유저명 : 누적 신고 횟수 } => id_list만큼 미리 선언
reports = set(report) # report의 중복(같은 유저가 같은 대상에게 신고한 것) 제거
for i in reports :
reporter, obj = i.split(" ")
history[reporter].append(obj) # 신고자의 신고 이력에 대상을 추가 (신고자의 신고 이력이 없으면 빈 배열에 추가)
if report_count[obj] < k : # 신고당한 유저의 누적 신고 횟수가 k 미만일 때 (k 이상인 경우 더 카운트할 필요가 없으므로)
report_count[obj] += 1 # 신고당한 유저의 누적 신고 횟수 + 1
return [len([x for x in history[user] if report_count[x] == k]) for user in id_list] # 신고자 목록으로 순회, 신고자의 신고 대상 목록에서 신고 수가 k인 유저의 수를 리스트로 반환728x90
반응형
'알고리즘' 카테고리의 다른 글
| [Python] 프로그래머스 코딩테스트 연습 - 2021 Dev-Matching: 웹 백엔드 개발자(상반기) > 다단계 칫솔 판매 (Lv.3) (2) | 2024.03.26 |
|---|---|
| [Python] 프로그래머스 코딩테스트 연습 - 2021 KAKAO BLIND RECRUITMENT > 메뉴 리뉴얼 (Lv.2) (0) | 2024.03.23 |
| [Python] 프로그래머스 코딩테스트 연습 - 해시 > 베스트앨범 (Lv.3) (0) | 2024.03.21 |
| [Python] 프로그래머스 코딩테스트 연습 - 2021 카카오 채용연계형 인턴십 > 표 편집 (Lv.3) (0) | 2024.03.19 |
| [알고리즘, Java] 최대공약수, 최소공배수 구하기 (0) | 2024.03.14 |