출처: 프로그래머스
https://programmers.co.kr/learn/courses/30/lessons/92334
def solution(id_list, report, k):
answer = [0] * len(id_list)
cnt = {id:0 for id in id_list} # id 별 신고된 횟수
d = {id:[] for id in id_list} # 이용자 id 가 신고한 id들 딕셔너리
for repo in set(report):
rep = repo.split(' ') # 이용자id와 신고한 id 분리
d[rep[0]].append(rep[1]) # 딕셔너리에서 이용자 id 키에 신고한 id들 추가
cnt[rep[1]] += 1 # 신고횟수
# print(d)
for key,values in d.items():
for val in values:
if cnt[val] >= k: # 신고횟수가 k번 이상이면
answer[id_list.index(key)] += 1
# print(answer)
return answer
풀이
딕셔너리를 사용해 풀이했다.
문제 풀이에 필요한 딕셔너리와 답 배열이다.
이용자와 신고한 id가 같아서 헷갈리기에 정리를 잘 하고 코딩을 하자.
- d = { 이용자 id : [신고한 id들...]}
- cnt = { 신고당한 id : 신고당한 횟수 }
- answer = [ id_list 순서대로 k번 이상 신고당한 유저를 신고한 회원들에게 메일 보낸 횟수 +1 ]
- 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
- 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
- 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
이 조건에서 한 유저가 한 유저를 계속 신고하는 것은 1회로 처리하기에 set(report)를 해준다.
이는 테스트케이스2를 보고 이해하면 된다.
공백 기준으로 set(report)를 잘라주고 만들어둔 d 딕셔너리에 삽입한다.
또, cnt 딕셔너리에 신고당한 id 별 신고 횟수를 적는다.
모두 딕셔너리에 넣고, cnt 딕셔너리에서 k번 이상 신고당한 유저들을 신고한 유저인 d 딕셔너리의 key를
answer에서 메일 보낸 횟수 +=1 해준다.
* 딕셔너리 작성
cnt = {id:0 for id in id_list} # id 별 신고된 횟수
d = {id:[] for id in id_list} # 이용자 id 가 신고한 id들 딕셔너리
말이 쫌 길긴 하지만, 충분히 풀 수 있다.
카카오 2022 블라인드 코딩테스트 채용 문제라고 한다.
'알고리즘 문제 풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 숫자 문자열과 영단어 python (0) | 2022.03.22 |
---|---|
[프로그래머스] 로또의 최고 순위와 최저 순위 python (0) | 2022.03.22 |
[프로그래머스] 더 맵게 c++ (0) | 2022.03.19 |
[프로그래머스] 단어 변환 c++ (*) (0) | 2022.03.19 |
[프로그래머스] 네트워크 c++ (0) | 2022.03.18 |