Notice
Recent Posts
Link
- Today
- Total
hye-log
[프로그래머스]신고 결과 받기(Python) 본문
0. 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/92334?language=python3
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 문제 설명
1) report로부터 신고자 id와 신고 대상 id를 받아서 신고 횟수 누적 & 신고자 기록
2) k번 이상 신고된 아이디를 신고해서 메일을 받아야 하는 신고자 구하기
3) 이용자 id 별로 메일 받아야 하는 구하기
2. 입출력
# input
id_list = ["muzi", "frodo", "apeach", "neo"]
report = ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]
k = 2
# output
result = [2,1,1,0]
3. 코드
1) 첫 번째 코드
def solution(id_list, report, k):
# id_list : 이용자 id 배열
# report : 신고한 id 배열
# k : 기준이 되는 신고 횟수
answer = []
id_count = [0 for i in range(len(id_list))] # id_count : 신고 횟수
report_list = [[] for i in range(len(id_list))] # report_list : 누가 신고했는지
id_mail = [0 for i in range(len(id_list))] # id_mail : 결과 메일 횟수
# report에서 신고 횟수 누적 & 신고자 기록
for i in range(len(report)):
report_who = report[i].split(' ')[0] # report_who : 신고자
report_id = report[i].split(' ')[1] # report_id : 신고 대상 id
for j in range(len(id_list)):
if report_id == id_list[j]: # 신고 대상 id와 id_list 가 같으면
if report_who not in report_list[j]: # 신고자가 최초 신고자면
report_list[j].append(report_who) # 신고자 이름 기록
id_count[j] += 1 # 신고 횟수 1 누적
# k번 이상으로 정지된 아이디를 신고해서 메일 받아야 하는 사람 반환
list_mail = []
for i in range(len(id_list)):
if id_count[i] >= k:
list_mail = list_mail + report_list[i]
# print(type(list_mail[0]))
# 메일 횟수 count
for i in range(len(list_mail)):
for j in range(len(id_list)):
if list_mail[i] == id_list[j]: # 이용자에게
id_mail[j] += 1
answer = id_mail
return answer
실행 결과
반복문을 사용하다보니 시간 초과가 발생
조금 더 효율적인 코드 작성이 필요함
2) 두 번째 코드
def solution(id_list, report, k):
# id_list : 이용자 id 배열
# report : 신고한 id 배열
# k : 기준이 되는 신고 횟수
answer = []
id_count = [0 for i in range(len(id_list))] # id_count : 신고 횟수
report_list = [[] for i in range(len(id_list))] # report_list : 누가 신고했는지
id_mail = [0 for i in range(len(id_list))] # id_mail : 결과 메일 횟수
# report에서 신고 횟수 누적 & 신고자 기록
for i in range(len(report)):
report_who = report[i].split(' ')[0] # report_who : 신고자
report_id = report[i].split(' ')[1] # report_id : 신고 대상 id
index = id_list.index(report_id) # report_id를 id_list에서 찾기
if report_who not in report_list[index]: # 신고자가 최초 신고자면
report_list[index].append(report_who) # 신고자 이름 기록
id_count[index] += 1 # 신고 횟수 1 누적
# k번 이상으로 신고된 아이디를 신고해서 메일 받아야 하는 사람 반환
list_mail = []
for i in range(len(id_list)):
if id_count[i] >= k: # k번 이상 신고된 아이디
list_mail = list_mail + report_list[i] # 리스트에 추가
# 메일 횟수 count
for i in range(len(list_mail)):
index = id_list.index(list_mail[i]) # list_mail[i]에 해당하는 index 찾아서
id_mail[index] += 1 # id_mail 1 증가
answer = id_mail
return answer
실행 결과
반복문보다 index를 사용하니 시간 단축
4. 알게된 점
1) 일정한 개수만큼 배열을 반환할 때 배열의 초기화가 필요하다
# list의 개수만큼 배열을 초기화할 때
count_list = [0 for i in range(len(list))]
2) for 문으로 index를 찾는 것보다 index 함수를 사용하면 시간을 단축할 수 있다
# a 배열에서 b를 찾을 때
index = a.index(b)
5. Github 링크
https://github.com/iihye/Algorithm/blob/main/Programmers/report_results.py
GitHub - iihye/Algorithm
Contribute to iihye/Algorithm development by creating an account on GitHub.
github.com
728x90
'CodingTest > Programmers' 카테고리의 다른 글
[프로그래머스]없는 숫자 더하기(Python) (0) | 2022.07.19 |
---|---|
[프로그래머스]키패드 누르기(Python) (0) | 2022.07.18 |
[프로그래머스]숫자 문자열과 영단어(Python) (0) | 2022.07.12 |
[프로그래머스]신규 아이디 추천(Python) (0) | 2022.07.12 |
[프로그래머스]로또의 최고 순위와 최저 순위(Python) (0) | 2022.07.08 |
Comments