문제요약
나의 코드 및 설명
def solution(id_list, report, k):
#각 유저가 k번 이상 신고당한다면, 그 유저를 신고한 사람에게 메일이 전달되고,
#answer 리스트는 각 유저별 메일을 받은 횟수를 저장
answer = [0 for _ in range(len(id_list))]
check = [0 for _ in range(len(id_list))] #각 유저가 신고받은 횟수
who = [[] for _ in range(len(id_list))] #각 유저를 신고한 신고자 리스트
#set으로 중복을 제거해준다(한 유저가 다른 유저를 여러 번 신고할 경우 카운트 되는 것을 방지)
report = list(set(report))
#리포트 신고내역 하나씩 분석
for i in report:
r_arr = list(map(str, str(i)))
idx_space = r_arr.index(" ") #공백을 기준으로 좌 우 문자열을 나누기 위함
to = "".join(map(str, r_arr[:idx_space])) #공백을 기준으로 좌측 문자열
fro = "".join(map(str, r_arr[idx_space+1:])) #공백을 기준으로 우측 문자열
idx = id_list.index(fro) #신고받은 사람의 인덱스
check[idx] += 1 #각 유저가 신고받은 횟수 카운트
who[idx].append(to) #신고를 누가했는지 who 리스트에 저장
for j in range(len(id_list)): #모든 유저를 살펴보면서
if check[j] >= k: #check리스트(각 유저가 신고받은 횟수를 저장한 리스트) 원소가 k이상이라면
for z in who[j]: #who 리스트에서 누가 신고했는지 본다.
answer[id_list.index(z)] += 1 #신고한 유저는 메일을 받으므로 answer 원소값을 카운트+1 해준다.
return answer
다른 코드 및 설명
##다른 코드
def solution(id_list, report, k):
answer = [0] * len(id_list) #메일 받은 횟수
reports = {x : 0 for x in id_list} #신고 받은 횟수
#{"무지":0, "프로도":0, "어피치":0, "네오":0}
for r in set(report):
reports[r.split()[1]] += 1 #r.split() : 공백을 기준으로 나누기
for r in set(report):
if reports[r.split()[1]] >= k: #신고받은 횟수가 k회 이상이라면
answer[id_list.index(r.split()[0])] += 1 #신고한 사람에 해당하는 answer 원소값에 +1
return answer
딕셔너리 컴프리헨션
split() : 기준 문자를 기점으로 분리 후 리스트로 반환
피드백
와.. 겨우 풀었다. 1시간 정도 걸렸다. Lv1 문제라 못풀었으면 멘붕일 뻔했다.. ㅠㅠ 다른 사람과 코드를 비교해보니 내가 작성한 소스 코드가 많이 복잡한 것을 알 수 있었다. 다른 코드는 딕셔너리를 활용했다. 신고 받은 횟수를 저장하는 딕셔너리 reports를 생성하고, 해당 값이 k회 이상인 키에 해당하는 answer 원소값을 1 더해주어 answer를 출력했다. 딕셔너리 컴프리헨션, 문자열 공백으로 나누기 등을 학습할 수 있는 매우 유익한 문제였다.
'Programmers > Lv1' 카테고리의 다른 글
[프로그래머스] 문자열 내 마음대로 정렬하기 (Lv1) (0) | 2023.07.24 |
---|---|
[프로그래머스] 개인정보 수집 유효기간 (Lv1) / 2023 카카오 블라인드 채용 (0) | 2023.06.16 |
[프로그래머스] 신규 아이디 추천 (Lv1) / 2021 카카오 블라인드 채용 (0) | 2023.06.16 |