https://school.programmers.co.kr/learn/courses/30/lessons/92334
해쉬 자료구조를 사용한다.
set 자료 구조를 사용해 report 배열의 중복 값을 제거한다.
딕셔너리 두 개를 생성한 뒤, 다음 값을 저장한다.
1) reportHash = {신고자 : {신고 받은 사람들}}
2) stoped = {신고 받은 사람 : 신고 받은 횟수(int형)}
id_list에 저장된 아이디 순서대로, 해당 아이디가 신고한 아이디들을 stoped 자료구조에서 확인한 후, 신고 받은 횟수를 k값과 비교해 계정이 정지되었으면 mail 변수를 증가시킨다.
mail 변수에 최종적으로 개인이 신고한 계정 중 정지된 계정의 수를 저장한다.
프로그래머스와 함께하는 PCCP 합격 대비 : 실전 모의고사 해설 강의(Python편) 강의의 내용과 코드를 참고하였습니다.
import collections # 딕셔너리 사용을 위한 라이브러리
def solution(id_list, report, k):
answer = []
report = list(set(report)) # report 배열의 중복 요소 제거
# 해시 자료구조 2개 생성
reportHash = collections.defaultdict(set) # 신고자와 신고받은 사람
stoped = collections.defaultdict(int) # 한 사람 당 신고받은 횟수
for x in report:
a, b = x.split(" ")
reportHash[a].add(b) # add 문법 (딕셔너리의 set 형식인 value에 값을 추가할 때는 add 함수를 사용함)
stoped[b] += 1
for id in id_list:
mail = 0 # 한 사람당 신고한 사람 중 계정 정지된 아이디의 수를 카운팅
for user in reportHash[id]:
if stoped[user] >= k:
mail += 1
answer.append(mail)
return answer
실행 결과
def solution(id_list, report, k):
answer = [] # 신고한 회원 중 정지당한 회원 수 기록
count = {} # 신고 횟수 count
for i in range(len(id_list)):
count[id_list[i]] = 0
report2 = []
for i in report:
if i not in report2:
report2.append(i)
report = []
for i in report2:
report.append(i.split(" "))
for i in range(len(report)): # 신고한 사람:i[0], 신고받은 사람:i[1]
count[report[i][-1]] += 1
singo = []
for i in id_list:
if count[i] >= k:
singo.append(i) # 신고 당한 사람 추림
answer2 = {} # 회원: 신고해서 정지된 회원 수 (딕셔너리 생성)
for i in range(len(id_list)):
answer2[id_list[i]] = 0
for i in range(len(report)):
if report[i][-1] in singo:
answer2[report[i][0]] += 1
for i in id_list: # id_list에 있는 회원들이 신고한 인원 중, 정지된 아이디의 수를 순서대로 answer 배열에 append
answer.append(answer2[i])
return answer
하지만 위 코드는 시간 초과 에러가 나타난다. 시간 초과 에러를 해결하기 위해 코드를 다시 구현할 것이다.
결과 ㅠㅠ해결했다!