프로그래머스 92334. 신고 결과 받기
신고 결과 받기 문제를 풀면서 얻어갈 수 있는 것들이 무엇이 있는지 살펴보고 뜯어 먹어보자. 간단한 문제이지만 다양한 상황에 쓰일 수 있는 유용한 기본 스킬들을 배울 수 있다.
얻어 가야 하는 것
요즘 파이썬을 공부하면서 파이썬으로 알고리즘 문제를 풀어보고 있는데, 속도는 느리지만 정말 편리한 언어라는 것을 느끼고 있다. 기본적인 내용이지만 숙지하여 적재적소에 활용하도록 하자.
간편한 초기화
- Python 3
» { x : 0 for x in key_list }
- 모든 key에 대해 0으로 초기화하는 코드
» [0] * len(param)
- param 길이 만큼의 리스트를 0으로 초기화하는 코드
» [[0]len(param) for i in range(len(param))]
- param 길이 x param길이 사이즈의 2차원 리스트를 0으로 초기화하는 코드
데이터 중복 제거
- Python 3
» set
- set 은 자료의 순서를 보장하지 않으며, 중복을 허락하지 않는 자료형이다. (2.3부터 지원)
- set(list) : list에 중복되는 요소가 있는 경우 중복을 제거한 집합을 만든다.
- add, remove, update, 합집합, 교집합, 차집합 등의 연산을 지원한다.
- 비어있는 집합을 만들어서 add, update 할 수도 있지만, 선언할 때부터 리스트를 넣어주는 방법도 있다.
특정 요소의 인덱스 구하기
- Python 3
» id_list.index(id)
- id가 저장된 인덱스를 반환한다.
프로그래머스 92334 문제 링크 및 핵심 아이디어
https://programmers.co.kr/learn/courses/30/lessons/92334
- 처리 결과 메일을 받은 횟수를 배열에 담아 리턴하는 함수를 만드는 문제다.
- 처리 결과 메일을 받으려면 내가 신고한 유저가 k번 이상 신고를 당해야 한다.
- 답을 구하기 위해 알아야 하는 것
– 어떤 유저가 누구를 신고했는지?
– 누가 신고를 몇 번 당했는지?
- 답을 구하기 위해 알아야 하는 것
- set을 사용해 한 명이 같은 이용자를 여러 번 신고한 케이스를 제거할 수 있다.
- dict 자료형을 각 이용자가 신고 당한 횟수를 카운팅 하는 데 활용할 수 있다.
풀이
def solution(id_list, report, k):
reported_cnt = {x:0 for x in id_list}
received_mail_cnt = [0] * len(id_list)
for r in set(report): # report 형식 : '이용자id 신고한id'
reported_cnt[r.split()[1]] += 1
for r in set(report):
if reported_cnt[r.split()[1]] >= k:
received_mail_cnt[id_list.index(r.split()[0])] += 1
return received_mail_cnt