프로그래머스 신고 결과 받기(Python) - 2022 KAKAO BLIND RECRUITMENT

임동혁 Ldhbenecia·2024년 5월 7일

Algorithm

목록 보기
14/16
post-thumbnail

프로그래머스에 있는 2022년도 카카오 문제 중 레벨 1문제이다.
정답률이 38퍼이길래 풀어보았다.

정답 코드

def solution(id_list, report, k):
    answer = []
    
    report_dic = {}
    reported_dic = {}
    
    for i in id_list:
        report_dic[i] = []
        reported_dic[i] = set()  # 각 유저가 신고한 아이디를 중복 없이 저장하기 위해 set을 사용
    
    # 누가 누구를 신고했는지 찾기
    for r in report:
        reporter, reported = r.split()
        if reported not in report_dic[reporter]:
            report_dic[reporter].append(reported) 
        
    # 신고당한 사람을 key 값으로 잡아서 길이 비교, values가 k개 이상이면 정지
    for r in report:
        reporter, reported = r.split()
        reported_dic[reported].add(reporter)
    
    # 정지당한 회원 찾기
    stop_list = []
    for user_id, reporters in reported_dic.items():
        if len(reporters) >= k:
            stop_list.append(user_id)
    
    for user_id, reported in report_dic.items():
        count = 0
        for i in reported:
            if i in stop_list:
                count += 1
        answer.append(count)
        
    return answer

풀이 과정

문제를 확인하고 키 값으로 값을 엮어줘야할 것 같아 바로 딕셔너리를 사용하였다.

처음 코드를 짤 때 신고 당한 횟수 k보다 많으면 정지를 구하는 과정에서 막혀서 key값을 신고당한 사람으로 정하는 딕셔너리를 하나 더 생성하였다.

그렇게 key: 신고당한 사람, value: 신고한 사람으로 분류해서 신고한 사람이 k 이상일 경우 정지 회원 리스트에 추가해주었다.

처음에는 신고당한 사람을 단순 리스트로 짰는데 테스트케이스 2번에서 중복에서 걸려서 set으로 중복처리를 해주었다.

병목 지점

 # 누가 누구를 신고했는지 찾기
for r in report:
    reporter, reported = r.split()
    if reported not in report_dic[reporter:
        report_dic[reporter].append(reported) 

그렇게 해도 여전히 거의 다 실패를 하였는데, 누가 누구를 신고했는지 찾는 부분에서 if문으로 신고를 중복해서 하는 부분을 제거하였다.
위에서 set을 통해서 테스트케이스 2번은 통과하였지만 신고당한 사람이 아닌 누가 누구를 신고했는지에 대한 중복처리도 해줘야 했었다.

이후에는 신고자 딕셔너리를 순회하며 신고당한 사람이 정지 리스트에 있을 경우를 카운팅해서 풀이하였다.

풀이 후기

레벨 1임에도 카카오 문제여서 그런지 바로바로 풀리는 문제는 아니었다.
최근 레벨 1 문제들을 풀어보며 정답률이 낮은 문제들은 대부분 카카오 문제였고, 조금씩 풀어본 결과 알고리즘 자체는 거의 없이 지문을 해석하고 그대로 구현만 하는 수준인 것 같다.
1번 문제에서 나올법하다. 기본으로 깔고 가도록 정진하자.

0개의 댓글