Programmers - 신고 결과 받기

Daehwi Kim·2022년 1월 31일

programmers

목록 보기
1/1
post-thumbnail

2022 KAKAO BLIND RECRUITMENT - 신고 결과 받기

이 문제는 Lv. 1의 문제로서 2021년 카카오블라인드 채용에 나온 문제 로서 신고자와 신고당한 사람이 있고 k번 신고당하면 정지당합니다.

이때 신고한 사람의 메일로 처리결과를 발송하는데 각 아이디별로 처리결과 메일을 받은 횟수를 배열에 담아 리턴하는 문제입니다.


처음 풀이

처음 풀이할 때는 딕셔너리에 신고당한 사람과 신고자를 defaultdict(set) 변수에 담아 처리하면 되지 않을까 해서 아래와 같이 풀이했는데, 너무 복잡하게 풀이하였다. ㅜ

Code

from collections import defaultdict

def solution(id_list, report, k):
    # 각 아이디별로 신고한 사람의 이름을 담는 딕셔너리 생성(중복 x)
    person_reported = defaultdict(set)
    # 최종 처리결과 메일을 받는 횟수를 담는 딕셔너리 생성
    finally_reported_person = defaultdict(int)
	answer = []
    
    # 아이디별 신고한 사람들을 밸류값에 담는다.
    for r in report:
        start, target = r.split(' ')
        person_reported[target].add(start)

    # 각 아이디별 신고당한 횟수가 k번 넘으면 finally_reported_person 딕셔너리 밸류값에 횟수를 계산
    for target, begin in person_reported.items():
        if len(begin) >= k:
            for id in person_reported[target]:
                finally_reported_person[id] += 1

    # 최종 정답배열에 처리결과메일을 받은 횟수를 담아 리턴
    for id in id_list:
        answer.append(finally_reported_person[id])

    return answer

다른 사람의 풀이를 참고하여 풀이

다른사람의 풀이를 참고하여 신고자와 신고당한사람의 아이디를 담는 report 배열을 set() 함수를 이용하여 중복신고자 없이 신고한 횟수를 계산할 수 있엇고, 조금더 가독성이 좋게 코드를 개선해보았다.

Code

from collections import defaultdict

def solution(id_list, report, k):
    # 처리결과 메일을 카운트하기 위해 id_list 길이만큼의 배열 생성
    answer = [0] * len(id_list)
    # 신고당한 횟수를 담기위한 변수 생성 : 밸류값이 기본 0값인 딕셔너리
    count_person_reported = defaultdict(int)
    
    # 신고당한 횟수 카운트
    # 중복을 제거하여 한사람이 같은 사람을 신고할 수 없다.
    for r in set(report):
        person_reported = r.split()[1]
        count_person_reported[person_reported] += 1
    
    # 최종 처리 결과메일 카운트
    for r in set(report):
        report, target = r.split()
        if count_person_reported[target] >= k:
            answer[id_list.index(report)] += 1
    
    return answer
profile
게으른 개발자

0개의 댓글