코딩한걸음
728x90
반응형

문제 내용

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

더보기
# 신고 결과 받기

 

# 문제 설명
# 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
# 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
# 한 유저를 여러 번 신고할 수도 있지만,
# 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
# k번 이상 신고된 유저는 게시판 이용이 정지되며,
# 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
# 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에
# 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.

 

# 이용자의 ID가 담긴 문자열 배열 id_list,
# 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report,
# 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때,
# 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아
# return 하도록 solution 함수를 완성해주세요.

 

# 제한사항
# 2 ≤ id_list의 길이 ≤ 1,000
# 1 ≤ id_list의 원소 길이 ≤ 10
# id_list의 원소는 이용자의 id를 나타내는 문자열이며 알파벳 소문자로만 이루어져 있습니다.
# id_list에는 같은 아이디가 중복해서 들어있지 않습니다.
# 1 ≤ report의 길이 ≤ 200,000
# 3 ≤ report의 원소 길이 ≤ 21
# report의 원소는 "이용자id 신고한id"형태의 문자열입니다.
# 예를 들어 "muzi frodo"의 경우 "muzi"가 "frodo"를 신고했다는 의미입니다.
# id는 알파벳 소문자로만 이루어져 있습니다.
# 이용자id와 신고한id는 공백(스페이스)하나로 구분되어 있습니다.
# 자기 자신을 신고하는 경우는 없습니다.
# 1 ≤ k ≤ 200, k는 자연수입니다.
# return 하는 배열은 id_list에 담긴 id 순서대로 각 유저가 받은 결과 메일 수를 담으면 됩니다.

 


풀이

id_list = ["con", "ryan"]
report = ["ryan con", "ryan con", "ryan con", "ryan con"]
k = 2
# [2,1,1,0]

report_dic = {}
report_count = {}
answer = [0]*len(id_list)

# report_dic = {신고한사람:set([신고받은사람])}
# 중복 적용을 피하기위해 set으로 정의
# report_count = {신고받은사람:신고받은 횟수}
for i in id_list:
    report_dic[i]=set([])
    report_count[i]=0

for i in report:
    # 신고자, 신고받은사람 정의
    reporter, suspect = i.split(' ')[0], i.split(' ')[1]
    # 중복 예외처리
    if not report_dic[reporter]&set([suspect]):
        report_count[suspect]+=1
    report_dic[reporter] |= set([suspect])

# report_count에서 각 아이디별 신고받은 횟수가 k를 넘으면 answer에 추가
for idx,value in enumerate(id_list):
    for i in report_dic[value]:
        if report_count[i]>=k:
            answer[idx]+=1
        
print(answer)

딕셔너리랑 집합으로 접근한게 좋은 판단이였다

별 어려움없이 한번에 잘 풀어서 기분좋음

 

뭔가 if문하고 for문을 많이 써야할거같으면 딕셔너리로 접근하고

중복허용이 안된다면 집합으로 접근하는게 문제 풀 때 아주 좋은 방식인 듯

 


제출용 함수

def solution(id_list, report, k):
    report_dic = {}
    report_count = {}
    answer = [0]*len(id_list)
    for i in id_list:
        report_dic[i]=set([])
        report_count[i]=0
    for i in report:
        reporter, suspect = i.split(' ')[0], i.split(' ')[1]
        if not report_dic[reporter]&set([suspect]):
            report_count[suspect]+=1
        report_dic[reporter] |= set([suspect])
    for idx,value in enumerate(id_list):
        for i in report_dic[value]:
            if report_count[i]>=k:
                answer[idx]+=1
    return answer

 

 

728x90
반응형
profile

코딩한걸음

@Joonyeol_Yoon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!