[프로그래머스] 신고결과 받기 – 92334

문제를 많이 꼬운 92334번에 대해서 설명하겠습니다.

– 92334번 flowchart

1. 변수 초기화 및 매핑

  • mapping: 유저 ID와 배열 인덱스의 매핑을 위한 딕셔너리입니다. 이는 각 유저를 식별하는 데 사용됩니다.
  • bit_table: 유저가 다른 유저를 신고했는지 여부를 추적하기 위한 2차원 배열입니다. 여기서 0은 신고하지 않음, 1은 신고함을 나타냅니다.
  • reported: 각 유저가 얼마나 많이 신고 받았는지 기록하는 딕셔너리입니다.
  • answer: 최종적으로 각 유저가 받게 될 메일의 수를 저장하는 딕셔너리입니다.

2. 신고 처리

  • 코드는 report 배열을 순회하며 각 신고를 처리합니다.
  • 각 신고는 공백을 기준으로 분리된 두 개의 문자열로 구성되어 있습니다. 이를 who_report 배열로 분리합니다.
  • bit_table을 사용하여 각 유저가 특정 유저를 이미 신고했는지 여부를 확인합니다. 이전에 신고하지 않았다면, 신고 처리를 합니다.
  • 신고된 유저(who_report[1])의 reported 값을 1 증가시킵니다.

3. 결과 계산

  • 각 유저별로 신고한 사람들을 검사합니다(bit_table 참조).
  • 만약 어떤 유저가 다른 유저를 신고했고, 그 신고된 유저가 k번 이상 신고를 받았다면, 신고한 유저의 answer 값을 1 증가시킵니다.

4. 결과 반환

  • answer 딕셔너리의 값들을 리스트로 변환하여 반환합니다. 이 리스트는 각 유저가 받게 될 결과 메일의 수를 나타냅니다.

5. 92334번 코드

  • 92334번의 코드와 테스트 케이스입니다.
Python
def solution(id_list, report, k):
    mapping = {value:index for index,value in enumerate(id_list)} #list index를 대용하기 위한 mapping용 dictionary
    bit_table = [[0 for i in range(len(id_list))] for i in range(len(id_list))] #이미 신고한 사람을 걸러내기 위한 table
    reported = {value : 0 for value in id_list} #신고 당한 횟수를 세기 위한 dicitonary
    answer = reported.copy() #신고한 사람이 정지된 횟수를 기록하기 위한 dict
    for i in range(0,len(report)) : 
        who_report = report[i].split() #input 이 "muzi frodo"식으로 muzi가 frodo를 신고한 것으로 처리해야 하니 split함수를 적용
        if bit_table[mapping[who_report[0]]][mapping[who_report[1]]] == 0 : #split한 값 muzi가 frodo  를 신고 한 적 있는지 판단
            bit_table[mapping[who_report[0]]][mapping[who_report[1]]] = 1  #muzi는 frodo를 신고했다를 기록
            reported[who_report[1]] +=1                                    #frodo에게 신고횟수 적립
       
    for b_index,bit in enumerate(bit_table) : #bit_table 참조 이는 id 를 가진 사람이 누굴 신고했나가 기록되어 있음
        for index,b_value in enumerate(bit) : #bit_table의 행 순서대로, 현재 for문에서는 index 는 누가 신고당했는지 b_value는 신고를 한 적이 있는지를 조사
            if b_value and reported[id_list[index]] >= k : #신고한 적이 있으며, 신고당한 사람이 k번보다 많이 당했다면
                answer[id_list[b_index]] +=1            #신고를 한사람에게 메일을 보낸다.

    return list(answer.values())


print(solution(["muzi", "frodo", "apeach", "neo"],["muzi frodo", "muzi frodo", "apeach frodo", "frodo neo", "muzi neo", "apeach muzi"],2)) #[2, 1, 1, 0]
print(solution(["muzi", "frodo", "apeach", "neo"], ["muzi frodo", "apeach frodo", "apeach neo", "muzi neo"], 1)) #[2, 0, 2, 0]
print(solution(["ab", "b", "c"], ["b ab", "c ab", "c b"], 2)) #[0, 1, 1]
print(solution(["a", "ab", "abc", "b"], ["ab a", "ab abc", "ab b", "abc a", "abc ab", "abc b"], 2)) #[0, 2, 2, 0]
print(solution(["ab", "b"], ["ab b"], 1)) #[1, 0]
print(solution(["abc", "acd", "add", "abd"], ["abc abd", "abc add", "acd abd", "abc abd", "add abd"], 2))  #[1, 1, 1, 0]

6. 트러블

92334 의 문제가 길어서 테스트 케이스를 중심으로 코드를 작성하다 보니 k번 이상 신고 당할 수 없는 줄 알고 프로그래밍 했다가 시간이 많이 걸렸다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Scroll to Top