[Hashing] 신고 결과 받기 (프로그래머스 강의, Level1)

Soorim Yoon·2022년 9월 8일
0
post-thumbnail

문제

https://school.programmers.co.kr/learn/courses/30/lessons/92334

  • 이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.

풀이

  • 해쉬 자료구조를 사용한다.

  • set 자료 구조를 사용해 report 배열의 중복 값을 제거한다.

  • 딕셔너리 두 개를 생성한 뒤, 다음 값을 저장한다.
    1) reportHash = {신고자 : {신고 받은 사람들}}
    2) stoped = {신고 받은 사람 : 신고 받은 횟수(int형)}

  • id_list에 저장된 아이디 순서대로, 해당 아이디가 신고한 아이디들을 stoped 자료구조에서 확인한 후, 신고 받은 횟수를 k값과 비교해 계정이 정지되었으면 mail 변수를 증가시킨다.

  • mail 변수에 최종적으로 개인이 신고한 계정 중 정지된 계정의 수를 저장한다.

코드

정답

프로그래머스와 함께하는 PCCP 합격 대비 : 실전 모의고사 해설 강의(Python편) 강의의 내용과 코드를 참고하였습니다.

import collections          # 딕셔너리 사용을 위한 라이브러리
def solution(id_list, report, k):
    answer = []
    
    report = list(set(report))      # report 배열의 중복 요소 제거
    
    # 해시 자료구조 2개 생성
    reportHash = collections.defaultdict(set)       # 신고자와 신고받은 사람
    stoped = collections.defaultdict(int)           # 한 사람 당 신고받은 횟수
    
    for x in report:
        a, b = x.split(" ")
        reportHash[a].add(b)        # add 문법 (딕셔너리의 set 형식인 value에 값을 추가할 때는 add 함수를 사용함)
        stoped[b] += 1
    
    for id in id_list:
        mail = 0        # 한 사람당 신고한 사람 중 계정 정지된 아이디의 수를 카운팅
        for user in reportHash[id]:
            if stoped[user] >= k:
                mail += 1
        answer.append(mail)
    
    return answer

실행 결과

오류 코드 (예전 코드)

def solution(id_list, report, k):
    answer = []     # 신고한 회원 중 정지당한 회원 수 기록
    
    count = {}      # 신고 횟수 count
    for i in range(len(id_list)):
        count[id_list[i]] = 0
    
    report2 = []
    for i in report:
        if i not in report2:
            report2.append(i)
        
    report = []
    for i in report2:
        report.append(i.split(" "))
    
    for i in range(len(report)):     # 신고한 사람:i[0], 신고받은 사람:i[1]
        count[report[i][-1]] += 1

    singo = []
    for i in id_list:
        if count[i] >= k:
            singo.append(i)     # 신고 당한 사람 추림
            
    answer2 = {}    # 회원: 신고해서 정지된 회원 수 (딕셔너리 생성)
    for i in range(len(id_list)):
        answer2[id_list[i]] = 0

    for i in range(len(report)):
        if report[i][-1] in singo:
            answer2[report[i][0]] += 1
    
    for i in id_list:       # id_list에 있는 회원들이 신고한 인원 중, 정지된 아이디의 수를 순서대로 answer 배열에 append
        answer.append(answer2[i])

    return answer

하지만 위 코드는 시간 초과 에러가 나타난다. 시간 초과 에러를 해결하기 위해 코드를 다시 구현할 것이다.

결과 ㅠㅠ 해결했다!

profile
👩🏻‍💻 AI를 좋아하는 IT학부생 > 성장하는 2년차 개발자

0개의 댓글