2022.06.22.
프로그래머스 '신고 결과 받기' 문제 피드백
1번째 시도: 시간 초과
def solution(id_list, report, k):
id_report = []
for i in id_list:
reported = []
for j in report:
j = j.split()
if i == j[0]:
if j[1] not in reported:
reported.append(j[1])
id_report.append(reported)
report_result = []
for i in id_list:
report_num = 0
for j in id_report:
for l in j:
if i == l:
report_num = report_num + 1
report_result.append(report_num)
order = 0
report_result_id = []
for i in report_result:
if i >= k:
report_result_id.append(id_list[order])
order = order + 1
answer = []
for i in id_report:
reported_num = 0
for j in i:
for l in report_result_id:
if j == l:
reported_num = reported_num + 1
answer.append(reported_num)
return answer
처음 풀어보는 프로그래머스의 코딩 문제였다.
감이 없어 일단 문제의 순서에 따라 코드를 작성하니
정답은 맞았지만 시간 초과로 틀리게 되었다.
2번째 시도: 시간 초과
def solution(id_list, report, k):
id_report = []
reported_list = []
for i in id_list:
reported = []
for j in report:
j = j.split()
if i == j[0]:
if j[1] not in reported:
reported.append(j[1])
reported_list.append(j[1])
id_report.append(reported)
report_result = []
for i in id_list:
if reported_list.count(i) >= k:
report_result.append(i)
answer = []
for i in id_report:
report_mail_num = 0
for j in i:
for l in report_result:
if j == l:
report_mail_num = report_mail_num + 1
answer.append(report_mail_num)
return answer
좀 더 간단하게 작성한 두 번째 코드..
그렇지만 역시나 시간초과
3번째 시도: 시간 초과
def solution(id_list, report, k):
id_report = []
reported_list = []
for i in id_list:
reported = []
for j in report:
j = j.split()
if i == j[0]:
if j[1] not in reported:
reported.append(j[1])
reported_list.append(j[1])
id_report.append(reported)
answer = [0] * len(id_list)
for i in id_list:
report_mail_num = 0
if reported_list.count(i) >= k:
order = 0
for j in id_report:
for l in j:
if l == i:
answer[order] = answer[order] + 1
order = order + 1
return answer
좀 더 간단하게 작성한 세 번째 코드조차 시간초과..
공부할 시간이 많지 않기에
그냥 다른 사람의 코드를 보기로 결정하였다
모범 답안
def solution(id_list, report, k):
answer = [0] * len(id_list)
reported = {x : 0 for x in id_list}
for i in set(report):
reported[i.split()[1]] += 1
for i in set(report):
if reported[i.split()[1]] >= k:
answer[id_list.index(i.split()[0])] += 1
return answer
진짜 깔끔한 코드.. 보자마자 놀랐다
- [ 0 ] * len( id_list ) : 0으로 채워진 list 만들기
- { x : 0 for x in id_list } : 신고 받은 횟수를 기록하기 위해 dictionary 생성
- set( report ) : 중복되는 신고횟수를 제거하기 위한 set( ) 함수
- reports[ r.split( )[1] ] += 1 : 신고 횟수 기록하기
- answer[ id_list.index( r.split( )[0] ) ] += 1 : 메일 받은 횟수 기록하기
'코딩테스트' 카테고리의 다른 글
[코딩테스트, Python] 프로그래머스 '소수 만들기' 문제 피드백 (0) | 2022.06.25 |
---|---|
[코딩테스트, Python] 프로그래머스 '완주하지 못한 선수' 문제 피드백 (Feat. Hash Table) (0) | 2022.06.24 |
[코딩테스트, Python] 프로그래머스 '신규 아이디 추천' 문제 피드백 (0) | 2022.06.24 |
[코딩테스트, Python] 백준알고리즘 6~10단계 문제 피드백 (0) | 2022.06.21 |
[코딩테스트 - Python] 백준알고리즘 1~5단계 문제 피드백 (0) | 2022.06.21 |