본문 바로가기

CodingTest

[프로그래머스] 신고 결과 받기 (카카오 문제) (Python)

문제 - 신고 결가 받기

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

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

나의 풀이

def solution(id_list, report, k):
    n =  len(id_list)

    id_list_num = {} # id별 인덱스 부여
    new_report = set(report) #중복 제거
    new_group = [[] for _ in range(n+1)] # 연결 정보 담은 배열
    counting = {} # 신고 당한 수 사전
    final = [] # k번 이상 신고 당한 사람 리스트

    answer = [0] * n

    j = 0
    for i in id_list:
        j += 1
        id_list_num.setdefault(i, j)
        counting.setdefault(i, 0)

    for j in new_report:
        a, b = j.split()
        counting[b] += 1
        for i in id_list_num:
            if a == i:
                num = id_list_num[i]
                new_group[num].append(b)
    for i in counting:
        if counting[i] >= k:
            final.append(i)
    num = 0
    for i in range(1, n+1):
        for j in final:
            if j in new_group[i]:
                num += 1
        answer[i-1] = num
        num = 0

    return answer

문제 해결 방법

1) Dictionary를 이용해서 문제를 해결했습니다.

2) 같은 사람이 동일인을 2번 이상 신고해도 1번으로 간주하므로 set 함수를 사용해 중복을 제거했습니다.

3) 접근을 쉽게 하기 위해 index 부여해 report를 딕셔너리(new_group) 형태로 변환하였고,

4) 이름 : 신고당한 사람 수 형태로 딕셔너리(counting)에 저장하였고,

5) k번 이상인 경우 배열(final)에 담았습니다.

5) 마지막으로, {이름 : 신고한 사람} 형태의 딕셔너리(new_group)의 value 값이 k번 이상 신고받은 사람(final)을 포함하고 있는 지 확인하였습니다.

   -> 포함하고 있다면, 처리 개수를 1씩 증가시켰습니다.

결과

다른 사람 풀이

def solution(id_list, report, k):
    answer = [0] * len(id_list)    
    reports = {x : 0 for x in id_list}

    for r in set(report):
        reports[r.split()[1]] += 1

    for r in set(report):
        if reports[r.split()[1]] >= k:
            answer[id_list.index(r.split()[0])] += 1

    return answer

 

나의 코드와 비교해보았을 때, 방법은 똑같았으나 코드가 훨씬 간결해 보입니다.

대표적으로 id_list에 index를 부여하는 부분을 id_list.index로 간결하게 표현할 수 있었다니..ㅎ

(for문으로 index를 부여해 새로운 딕셔너리에 담은 1인)

 

그외에도 내가 3줄 이상 작성한 코드가 한줄로 간결하게 나타낼 수 있는 부분이 많아서 현타가 쪼금 옵니다..

코드를 간결하게 표현할 수 있는 능력을 빠르게 습득해야겠습니다..!!!