https://programmers.co.kr/learn/courses/30/lessons/92334
문제부터 간단하게 요약하면,
신고를 처리하고, 처리결과를 메일로 발송하는 시스템에서, 정지기준이 주어질 때, 각 유저별로 본인이 신고한 사람에 대한 결과 처리 메일을 받은 횟수를 return 해주는 문제입니다.
문제의 규칙은 다음과 같습니다.
solution(id_list, report, k)에
id_list : 이용자의 ID
report : 각 이용자가 신고한 이용자의 ID정보가 담긴 문자열 배열 ex) "muzi frodo" 는 muzi가 frodo를 신고한 것
k : 정지 기준이 되는 신고 횟수
가 input으로 들어가면,
특정 유저가 정지를 당하게 되면, 그 유저를 신고한 사람들에게 이메일이 가게 되는데 각각의 user들이 받게 되는 email 수를 [2,1,1,0] 처럼 return 해야 합니다. (id_list의 사람들과 1:1 mapping)
<Solution>
우선 a라는 사람이 b를 여러번 신고하는 경우들은 존재하지 않아야 합니다.
그래서 2D array를 구성하여, 신고하는 경우들을 1을 채워주는 형식으로 구현하였습니다.
(set으로 중복을 제거하는 방향이 더 좋을 것 같습니다. )
그림으로 보면 다음과 같습니다. 이 경우에는 C라는 사람이 B를 신고한 경우입니다. 이렇게 각각에 대해 1을 채워주면, 중복없이 신고한 경우들에 대해 모두 생각 할 수 있습니다.
그리고 나서, 각각의 column에 대해 합을 구하면, 각 사람들이 총 몇번 신고되었는지를 알 수 있고, 이 결과를 바탕으로 k보다 크거나 같은 신고횟수를 받은 사람들에 해당하는 사람들에 대해 마찬가지로 이 2D array를 통해 결과를 return 할 수 있습니다.
실제 구현은 아래와 같습니다.
def solution(id_list, report, k):
matrix = [[0 for col in range(len(id_list))] for row in range(len(id_list))]
for report_element in report:
temp_list = report_element.split()
name_index = id_list.index(temp_list[0])
for i in range(1,len(temp_list)):
matrix[name_index][id_list.index(temp_list[i])] = 1
sum_id_list = [sum(x) for x in zip(*matrix)]
# use k
index_array = []
for i in range(len(id_list)):
if sum_id_list[i] >= k:
index_array.append(i)
else:
continue
return_array = [0 for i in range(len(id_list))]
# return_array = [0] * len(id_list)
for j in range(len(id_list)):
for num in index_array:
if matrix[j][num] == 1:
return_array[j]+=1
else:
continue
return return_array
'코딩테스트 > Python 문제풀이' 카테고리의 다른 글
[프로그래머스] 배달(Dijkstra) (0) | 2022.05.11 |
---|---|
[프로그래머스] 입국심사(이분탐색) (0) | 2022.05.10 |
[프로그래머스] N-Queen (0) | 2022.05.07 |
[프로그래머스] 순위(Floyd-Warshall Algorithm) (1) | 2022.05.06 |
[프로그래머스] 괄호 변환 (0) | 2022.05.06 |