본문 바로가기

두두의 알고리즘/문제

[해시] 프로그래머스 L1 '신고 결과 받기' (Python)

728x90

<문제 링크>

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

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr


<문제 풀이>

1. 답을 id_list 순서대로 적어야 하므로 id_list 개수만큼 [0] 추가

2. 한 유저가 같은 유저를 여러 번 신고한 경우는 신고 횟수 1회로 처리하기 때문에 set()으로 중복 제거

3. 신고한 유저를 딕셔너리-set()으로 선언 => 신고한 유저는 여러명일 필요가 없어서

4. 신고당한 유저를 딕셔너리-int()로 선언

5. 정지된 유저를 받을 변수 선언

6. report에서 신고당한 유저(오른쪽)에 +1

7. report에서 신고한 유저에 신고당한 유저 추가

8. 신고당한 횟수가 K번이면 정지된 유저에 유저명 추가

9. 신고한 유저 값에 정지된 유저가 있다면 해당하는 답 인덱스에 +1

 

<코드>

from collections import defaultdict

def solution(id_list, report, k):
    answer = [0] * len(id_list)

    report = set(report)
    
    left_report = defaultdict(set)
    right_report = defaultdict(int)
    
    stopID = []

    for r in report:
        r1, r2 = r.split()
        
        right_report[r2] += 1
        left_report[r1].add(r2)
        
        if right_report[r2] == k:
            stopID.append(r2)
            
    for s in stopID:
        for i in range(len(id_list)):
            if s in left_report[id_list[i]]:
                answer[i] += 1

    return answer

 

<고쳐야 할 점>

  • from collections import defaultdict 익히기
  • 복습 알고리즘