on my way

[프로그래머스 코딩테스트 연습] 신고결과 받기 (Python3) Lv1 본문

카테고리 없음

[프로그래머스 코딩테스트 연습] 신고결과 받기 (Python3) Lv1

wingbeat 2024. 8. 4. 08:29
반응형

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번 이상 신고당한 사용자를 차단하고, 각 사용자별로 차단된 사용자 수를 세는 문제를 해결했다.

코드의 동작 과정

  1. 초기화:
    • blacklist: 각 사용자가 신고당한 횟수를 저장하는 딕셔너리로, id_list의 사용자들을 키로 하여 0으로 초기화했다.
    • reportlist: 각 사용자가 신고한 사람을 저장하는 딕셔너리로, id_list의 사용자들을 키로 하여 빈 리스트로 초기화했다.
  2. 리포트 처리:
    • set(report)로 중복된 신고를 제거했다.
    • 각 신고(rp)에 대해 신고자(rpl)와 신고된 사람(bl)을 분리하고, reportlist에 신고된 사람을 추가하고 blacklist에서 신고된 횟수를 증가시켰다.
  3. 차단된 사용자 목록 생성:
    • blacklist에서 k번 이상 신고된 사용자를 blockedID 리스트에 추가했다.
  4. 결과 계산:
    • 각 사용자가 신고한 사람 중 차단된 사용자의 수를 세어 result 리스트에 추가했다.

정답은 맞았지만 시간 효율성에서 개선 필요하다고 생각했다.

 

 

 

최종 버전으로 수정 과정

최종 버전으로 가는 과정에서 코드의 효율성과 가독성을 향상시켰다. 주된 수정 사항은 다음과 같다:

  1. 초기화:
    • 딕셔너리 컴프리헨션을 사용하여 blacklistreportlist를 초기화하여 코드가 더 간결해졌다.
  2. 리포트 처리:
    • 동일하지만 reportlist에 추가할 때 + 연산자 대신 append 메서드를 사용하여 가독성을 높였다.
    • blacklist[reported]의 값을 증가시키는 위치를 수정하여 올바른 사용자에 대해 증가하도록 했다.
  3. 차단된 사용자 목록 생성:
    • 딕셔너리 컴프리헨션을 사용하여 k번 이상 신고된 사용자를 blockedID 리스트에 추가했다.
  4. 결과 계산:
    • 리스트 컴프리헨션과 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

수정 사항 요약

  1. 딕셔너리 초기화:
    • dict(zip(...)) 대신 딕셔너리 컴프리헨션 사용.
    • blacklist = {user: 0 for user in id_list}
    • reportlist = {user: [] for user in id_list}
  2. 리포트 처리:
    • reportlist[reporter] += [reported] 대신 reportlist[reporter].append(reported) 사용.
    • blacklist[bl] += 1에서 blacklist[reported] += 1로 수정.
  3. 차단된 사용자 목록 생성:
    • blockedID = [b for b in blacklist if blacklist[b] >= k] 대신 blockedID = [user for user, count in blacklist.items() if count >= k] 사용.
  4. 결과 계산:
    • 중첩된 for 루프 대신 리스트 컴프리헨션과 sum 함수 사용.

이렇게 함으로써 코드의 효율성과 가독성을 모두 향상시켰다.

최종 버전 코드는 초기화, 리포트 처리, 차단된 사용자 목록 생성, 결과 계산의 각 단계에서 보다 간결하고 효율적인 방법을 사용했다.

반응형