[Programmers][Py] 신고 결과 받기

mj·2024년 7월 11일
0

코딩테스트문제

목록 보기
32/50

✅ 문제

문제 바로가기

유저 - 한번에 1유저 신고 가능
동일유저 여러번 신고해도 신고횟수는 1회로 처리됨.

k번 이상 신고된 유저 - 정지
이 유저를 신고한 모든 유저에게 메일로 정지사실 알림.

리턴값 : 각 유저별로 처리 결과 메일을 받은 횟수를 담은 배열

✅ 나의 구현 과정

💡나의 아이디어

  1. 신고 처리
  2. k번 이상 신고당한 유저 정지처리
  3. 정지당한유저를 신고한 유저에게 메일로 알림처리 (메일 발송 횟수 계산)
  4. 메일 받은 횟수 return

필요한 변수

  • id_list: 유저 ID (배열)
  • reported[신고당한 유저 인덱스] = 신고한 사람 id목록 (2차원 배열)
  • 유저별 신고당한 횟수
  • result: 각 유저별로 처리 결과 메일을 받은 횟수 (배열)

처음에는 [유저 : 유저가 신고한 id목록]와 같은 형식을 생각하였다. 하지만, 신고당한 횟수를 계산하거나 신고한 유저를 찾아낼때 더 편리하기 위해 [신고당한 유저 : 신고한 사람들 id목록]으로 표현하도록 했다.


0. 유저 ID와 인덱스

id_list

["muzi", "frodo", "apeach", "neo"]

id

{"muzi":0, "frodo":1, "apeach":2, "neo":3}

딕셔너리를 사용하여 유저의 인덱스를 알아내기 쉽도록 했다.


1. 신고 처리

# 입력예시
# report
["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]

입력받은 report배열을 돌며 아래처럼 신고한 사람들을 id목록을 담은 reported (2차원 배열)을 완성시킨다.
단, 한 번 신고한 사람은 또 신고해도 1회로 처리되기 때문에 이미 신고한 사람 배열에 있으면 아무것도 하지않고 넘어가도록 한다.(continue)

reported 배열

인덱스(신고당한사람)신고한 사람
0["appeach"]
1["muzi", "appeach"]
2[]
3["frodo", "muzi"]
[
	["appeach"],
    ["muzi", "appeach"],
    [],
    ["frodo", "muzi"]
]

2. k번 이상 신고당한 유저 정지처리 + 3. 메일 발송 횟수 계산

  • 신고한 사람 목록 = reported의 value(배열)
  • 신고당한 횟수 = reported의 value(배열)의 길이
  • 각 유저별로 처리 결과 메일을 받은 횟수를 담은 배열 : result

reported배열을 돌며 신고당한 횟수가 k번 이상이라면, 신고한 사람의 목록에 있는 사람들의 카운트(result[신고한사람의 인덱스])를 1 증가시킨다.

# result 예시
[2,1,1,0]

최종적으로 result를 리턴한다.


✅ 나의 코드

def solution(id_list, report, k):
    l = len(id_list)
    reported = [[] for _ in range(l)] # 유저별 신고한사람들의 id목록
    result = [0 for _ in range(l)] # 유저별 메일받은 횟수

    # 0. 딕셔너리 생성 {유저id : 인덱스}
    id = {}
    for i in range(l):
        id[id_list[i]] = i
    
    # 1. 신고 처리
    # 신고당한사람 : [신고한 사람1, 2, ...]
    for str in report:
        a, b = str.split(" ")
        
        if a in reported[id[b]]:
            continue
        else:
            reported[id[b]].append(a)
    
    # 2. 정지 처리 (k번 이상 신고당한 사람)
    for arr in reported:
        if len(arr) >= k:
    # 3. 메일 발송 횟수 계산
            for user in arr:
                result[id[user]] += 1
            
    
    return result

✅ 다른 사람의 풀이

def solution2(id_list, report, k):
    answer = [0] * len(id_list) # 결과메일 받은 횟수
    reports = {x : 0 for x in id_list} # 유저별 신고당한 횟수

    # 유저별 신고당한 횟수 계산
    for r in set(report):
        reports[r.split()[1]] += 1

    # 결과메일 받은 횟수 계산
    for r in set(report):
        if reports[r.split()[1]] >= k:
            answer[id_list.index(r.split()[0])] += 1

    return answer
  1. 유저별 신고당한 횟수 계산
  2. 결과메일 받은 횟수 계산

✅ Comment

나의 코드와 다른 점

  • 여러번 신고해도 1회로 처리되는것을 set을 사용하여 구현
  • 나의 경우는 for문 하나와 중첩for문을 사용하였는데 다른 코드의 경우 for문 두개로 끝남.

요구사항을 구현하는것에만 집중하지말고 코드를 최적화할 수 있는 방법을 좀 더 깊이 생각하고 설계한 후에 구현해야겠다.

profile
일단 할 수 있는걸 하자.

0개의 댓글