문제를 많이 꼬운 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번 이상 신고 당할 수 없는 줄 알고 프로그래밍 했다가 시간이 많이 걸렸다.