https://programmers.co.kr/learn/courses/30/lessons/92334
코딩테스트 연습 - 신고 결과 받기
문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의
programmers.co.kr
1. 여담
거의 한 문제만 1시간 이상 쳐다본 거 같다. 생각하는 데 한 시간. 근데도 잘 모르겠어서 다른 블로그의 글을 많이 참고했다. 나는 아직 너무 초보라서 이런 걸 하는 건 힘든가보다.
def solution(id_list, report, k):
dic_rpt = {id:[] for id in id_list}
report = list(set(report))
for rpt in report:
user_id,report_id = rpt.split()
dic_rpt[report_id].append(user_id)
answer = {id_:0 for id_ in id_list}
for key, values in dic_rpt.items():
if len(values) >=k:
for value in values:
answer[value] += 1
return list(answer.values())
2. 코드해석
dic_rpt = {id:[] for id in id_list}
report = list(set(report))
나는 처음에 2차원 배열로 풀려고 했는데, 많은 분들이 딕셔너리를 많이 사용하시더라.
딕셔너리를 이용해서 id_list에서 id를 받아와 key값으로 지정한다.
또 set 함수가 들어갔는데, 중복되는 값을 제거하는 함수이다. (단, 순서는 뒤죽박죽이니 주의)
for rpt in report:
user_id,report_id = rpt.split()
dic_rpt[report_id].append(user_id)
answer = {id_:0 for id_ in id_list}
rpt의 값은 "muzi frodo" 이런 식으로 되어 있는데, 이것을 split 메소드를 이용해서 공백을 기준으로 해서 문자열을 분리 후 리스트로 반환한다.
그럼 user_id = 'muzi', report_id = 'frodo'이렇게 들어가있을 것이다.
이제 dic_rpt 딕셔너리에 신고된 사람을 키 값으로, 신고한 사람을 value값으로 삽입한다.
answer는 id_list에서 id를 받아와 딕셔너리로 만들어준다.
for key, values in dic_rpt.items():
if len(values) >=k:
for value in values:
answer[value] += 1
return list(answer.values())
answer는 신고한 사람의 이메일 받는 횟수를 카운트하고, dic_rpt는 value 값으로 key값을 신고한 사람을 넣게 되어있다.
우리는 dic_rpt.items()를 가져왔으니 신고한 사람들이 values값으로 들어가있을 것인데,
여기서 valus의 길이가 k 보다 많거나 같다면 k수, 혹은 그 이상의 사람들이 해당 key(아이디)를 신고했다는 의미이다.
-> 그러므로 values(신고한 사람들)의 value(신고한 사람)의 이메일 받는 횟수를 카운트하는 것이다. (answer[value])
그냥 리턴을 할 경우 { muzi : 2 } 이런 식으로 반환되므로, list형식으로 answer의 values값들을 받겠다는 것이다.
'코딩테스트 연습 > 프로그래머스' 카테고리의 다른 글
[Python] 프로그래머스 코딩테스트 연습 LV1 - 약수의 개수와 덧셈 (0) | 2022.01.18 |
---|---|
[Python] 프로그래머스 코딩테스트 연습 LV1 - 실패율 (0) | 2022.01.18 |
Python 을 이용한 프로그래머스 LV 1 - 모의고사 (0) | 2022.01.16 |
Python을 이용한 코딩테스트 연습 Lv1 - 소수 만들기 (0) | 2022.01.16 |
Python을 이용한 프로그래머스 코딩 테스트 연습 LV1 - 내적 (0) | 2022.01.15 |