https://school.programmers.co.kr/learn/courses/30/lessons/92334#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
def solution(id_list, report, k):
cnt = [0] * len(id_list) # 각 유저별 신고 당한 횟수 카운트
up_list = [] # k번 이상 신고 받은 유저 id 리스트
result = [0] * len(id_list)
report = list(set(report)) # 중복 신고 제거
# 각 유저별 신고 당한 횟수 카운트
for name in report:
give, receive = name.split()
cnt[id_list.index(receive)] += 1
# k번 이상 신고 받은 유저 id 리스트
for idx, num in enumerate(cnt):
if num >= k:
up_list.append(id_list[idx])
# 각 유저가 받은 결과 메일 수
for name in report:
give, receive = name.split()
if receive in up_list:
result[id_list.index(give)] += 1
return result
풀이
해당 문제를 풀 때 키 포인트는 중복 신고를 제거하기 위해 신고 정보 목록인 report를 set -> list 해주어야 한다 (집합 set은 중복 원소를 허용하지 않기 때문에). 또한 index 함수를 잘 활용해서 찾고자 하는 문자열의 인덱스를 반환해야 한다. 문제를 풀면서 크게 어려운 점은 없었지만 코드 작성 후 가독성 향상을 위해 다른 풀이도 살펴보았다.
다른 코드 & 풀이
def solution(id_list, report, k):
cnt_dic = {i:0 for i in id_list} # 신고 받은 횟수
result = [0] * len(id_list)
# 신고 받은 횟수 카운트
for name in set(report):
cnt_dic[name.split()[1]] += 1
# 각 유저가 받은 결과 메일 수 카운트
for name in set(report):
if cnt_dic[name.split()[1]] >= k:
result[id_list.index(name.split()[0])] += 1
return result
리스트를 여러 개 생성하지 않고 key를 id로, value를 신고 받은 횟수로 하는 딕셔너리를 생성해서 훨씬 가독성이 높은 코드를 완성할 수 있었다. 딕셔너리는 어떤 문제에서든 유용하게 사용할 수 있으니 사용법을 명확하게 익히고 자주 활용해보도록 해야겠다.
'Python > Coding Test' 카테고리의 다른 글
[프로그래머스] 신규 아이디 추천 (0) | 2024.02.26 |
---|---|
[프로그래머스] 숫자 문자열과 영단어 (0) | 2024.02.16 |
[프로그래머스] 개인정보 수집 유효기간 (0) | 2024.02.13 |
[프로그래머스] 가장 많이 받은 선물 (0) | 2024.02.08 |
[백준] 7562 : 나이트의 이동 (+ 그래프 정리) (0) | 2024.02.03 |