on my way
[프로그래머스 코딩테스트 연습] 신고결과 받기 (Python3) Lv1 본문
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/92334
[프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr](https://school.programmers.co.kr/learn/courses/30/lessons/92334)
초기 코드 설명 및 최종 버전 수정 과정
초기 코드 설명
def solution(id_list, report, k):
blacklist = dict(zip(id_list, [0 for _ in range(len(id_list))]))
reportlist = dict(zip(id_list, [[] for _ in range(len(id_list))]))
for rp in list(set(report)):
rpl, bl = rp.split()
reportlist[rpl] += [bl]
blacklist[bl] += 1
blockedID = [b for b in blacklist if blacklist[b] >= k]
result = []
for rp in reportlist:
cnt = 0
for r in reportlist[rp]:
if r in blockedID:
cnt += 1
result.append(cnt)
return result
이 코드는 각 사용자가 신고한 사람과 신고당한 횟수를 관리하여 k번 이상 신고당한 사용자를 차단하고, 각 사용자별로 차단된 사용자 수를 세는 문제를 해결했다.
코드의 동작 과정
- 초기화:
blacklist
: 각 사용자가 신고당한 횟수를 저장하는 딕셔너리로,id_list
의 사용자들을 키로 하여 0으로 초기화했다.reportlist
: 각 사용자가 신고한 사람을 저장하는 딕셔너리로,id_list
의 사용자들을 키로 하여 빈 리스트로 초기화했다.
- 리포트 처리:
set(report)
로 중복된 신고를 제거했다.- 각 신고(
rp
)에 대해 신고자(rpl
)와 신고된 사람(bl
)을 분리하고,reportlist
에 신고된 사람을 추가하고blacklist
에서 신고된 횟수를 증가시켰다.
- 차단된 사용자 목록 생성:
blacklist
에서 k번 이상 신고된 사용자를blockedID
리스트에 추가했다.
- 결과 계산:
- 각 사용자가 신고한 사람 중 차단된 사용자의 수를 세어
result
리스트에 추가했다.
- 각 사용자가 신고한 사람 중 차단된 사용자의 수를 세어
정답은 맞았지만 시간 효율성에서 개선 필요하다고 생각했다.
최종 버전으로 수정 과정
최종 버전으로 가는 과정에서 코드의 효율성과 가독성을 향상시켰다. 주된 수정 사항은 다음과 같다:
- 초기화:
- 딕셔너리 컴프리헨션을 사용하여
blacklist
와reportlist
를 초기화하여 코드가 더 간결해졌다.
- 딕셔너리 컴프리헨션을 사용하여
- 리포트 처리:
- 동일하지만
reportlist
에 추가할 때+
연산자 대신append
메서드를 사용하여 가독성을 높였다. blacklist[reported]
의 값을 증가시키는 위치를 수정하여 올바른 사용자에 대해 증가하도록 했다.
- 동일하지만
- 차단된 사용자 목록 생성:
- 딕셔너리 컴프리헨션을 사용하여 k번 이상 신고된 사용자를
blockedID
리스트에 추가했다.
- 딕셔너리 컴프리헨션을 사용하여 k번 이상 신고된 사용자를
- 결과 계산:
- 리스트 컴프리헨션과
sum
함수를 사용하여 더 간결하고 효율적으로 결과를 계산했다.
- 리스트 컴프리헨션과
최종 버전 코드
def solution(id_list, report, k):
# 초기화
blacklist = {user: 0 for user in id_list}
reportlist = {user: [] for user in id_list}
# 리포트 처리
for rp in set(report):
reporter, reported = rp.split()
reportlist[reporter].append(reported)
blacklist[reported] += 1
# 차단된 사용자 목록 생성
blockedID = [user for user, count in blacklist.items() if count >= k]
# 결과 계산
result = []
for user in id_list:
cnt = sum(1 for reported in reportlist[user] if reported in blockedID)
result.append(cnt)
return result
수정 사항 요약
- 딕셔너리 초기화:
dict(zip(...))
대신 딕셔너리 컴프리헨션 사용.blacklist = {user: 0 for user in id_list}
reportlist = {user: [] for user in id_list}
- 리포트 처리:
reportlist[reporter] += [reported]
대신reportlist[reporter].append(reported)
사용.blacklist[bl] += 1
에서blacklist[reported] += 1
로 수정.
- 차단된 사용자 목록 생성:
blockedID = [b for b in blacklist if blacklist[b] >= k]
대신blockedID = [user for user, count in blacklist.items() if count >= k]
사용.
- 결과 계산:
- 중첩된
for
루프 대신 리스트 컴프리헨션과sum
함수 사용.
- 중첩된
이렇게 함으로써 코드의 효율성과 가독성을 모두 향상시켰다.
최종 버전 코드는 초기화, 리포트 처리, 차단된 사용자 목록 생성, 결과 계산의 각 단계에서 보다 간결하고 효율적인 방법을 사용했다.
반응형