728x90
https://programmers.co.kr/learn/courses/30/lessons/92334
문제 풀이
딕셔너리 result는 키와 값을 다음과 같이 가진다.
key (사용자 id) : value [[신고한 유저, ], 신고받은 횟수, 받을 메일]
result를 이용해 전체적인 값을 정리했고 이후 확인하는 작업만 하면된다.
set의 특징을 이용해서 중복 신고를 없애서 신고들을 걸렀다.
느낀점
코딩 테스트를 대비해서 파이썬으로 시작해보았다. 아직 문법이 많이 익숙하지 않고, 알고리즘을 오랜만에 하다보니 생각보다 훨씬 어렵게 푸는 것 같았다. 꾸준하게만 하자..!!
고수들의 코드를 보니까 매우 충격적이었다... 알고리즘의 매력..?
1. index 함수를 이용해서 answer 리스트의 정확한 위치에 값을 추가 시키는 점
2. 쓸 데 없는 추가 구현과 반복이 없다는 점
내 코드는 굳이 딕셔너리를 초기화해서 반복문에서 값을 구하고
또 반복문을 돌려서 정지될 유저를 찾고
또 거기서 반복문을 돌려서 정지대상이 신고대상 리스트에 있을 때 값을 정산한ㄷㅏ.. 얼마나 비효율적인지...
갈 길이 많이 멀었다.
내 코드
def solution(id_list, report, k):
answer = []
result = {}
fbd_user = []
for id in id_list:
result[id] = [[], 0, 0]
for case in set(report):
result[case.split()[0]][0].append(case.split()[1])
result[case.split()[1]][1] += 1
for user in id_list:
if result[user][1] >= k:
fbd_user.append(user)
for user in id_list:
for forbidden in fbd_user:
if forbidden in result[user][0]:
result[user][2] += 1
answer.append(result[user][2])
return answer
고수의 코드
def solution(id_list, report, k):
answer = [0] * len(id_list)
reports = {x : 0 for x in id_list}
for r in set(report):
reports[r.split()[1]] += 1
for r in set(report):
if reports[r.split()[1]] >= k:
answer[id_list.index(r.split()[0])] += 1
return answer
'문제 풀이 > 프로그래머스 (Programmers)' 카테고리의 다른 글
[Python] 프로그래머스 : 숫자 문자열과 영단어 (0) | 2022.06.21 |
---|---|
[Python] 프로그래머스 : 신규 아이디 추천 (0) | 2022.06.19 |
[C++] 프로그래머스 : 튜플 (0) | 2021.11.08 |
[C++] 프로그래머스 : [1차] 뉴스 클러스터링 (0) | 2021.10.24 |
[C++] 프로그래머스 : 행렬 테두리 회전하기 (0) | 2021.10.12 |
댓글