Algorithm/프로그래머스

(파이썬) 프로그래머스 Lv.1 "신고 결과 받기"

innit 2022. 4. 20. 20:04

 

내 풀이

def solution(id_list, report, k):
    a = {} # {멤버id : 신고당한 횟수}
    b = {} # {멤버id : 나를 신고한 아이디 list}
    c = {} # {멤버id : 정답}

    for i in id_list:
        a[i] = 0
        b[i] = []
        c[i] = 0

    for i in report:
        if b[list(i.split())[1]].count(list(i.split())[0]) == 0:
            a[list(i.split())[1]] += 1
            b[list(i.split())[1]].append(list(i.split())[0])

    for i in a:
        if a[i] >= k:
            for j in b[i]:
                c[j] += 1

    return list(c.values())

1. 멤버id 별로 "몇 번 신고받았는지(a)", "누가 나를 신고했는지(b)"를 각각 저장하는 딕셔너리 2개를 만들었다.

 

2. 첫 번째 for문은 생성한 딕셔너리들(a, b, c)을 초기화하는 과정이다.

 

3. 두 번째 for문은 매개변수로 입력된 report에 담긴 정보를 기반으로 하여, 딕셔너리 a, b에 차곡 차곡 데이터를 쌓는다.

    1) list(i.split())[0]은 신고한 사람 id이다.

    2) list(i.split())[1]은 신고당한 사람 id이다.

    3) if문의 의미는 "이번에 신고당한 사람"이 "이번에 신고한 사람"으로 최초로 신고당한 것인지를 판단한다.

    4) if문에서 최초로 신고당한 것이 맞다면 타당한 신고이므로, if문의 내용을 실행한다.

 

4. 세 번째 for문은 딕셔너리 a, b에 담긴 값들을 통해, k번 이상 신고당한 사람을 신고한 사람 id(최종 답)을 딕셔너리 c에 담는다.

 

 

 

 

다른 사람 풀이

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

 

1. 리스트 answer에 id 개수만큼 0을 담는다.

 

2. 각 id별로 신고당한 횟수를 기입할 딕셔너리 reports를 만든다. (처음에는 모든 id가 신고를 0회 받았다.)

 

3. 첫 번째 for문

    1) report를 집합 자료형으로 바꾸었으므로, 중복되는 신고는 자동으로 걸러진다.

    2) r.split()[1]은 신고당한 사람이다.

    3) for문을 돌린 결과, reports에는 각 id별로 신고당한 횟수가 저장되었다.

 

4. 두 번째 for문

    1) 신고당한 횟수가 k번을 초과한 사람을 if문으로 찾아낸다.

    2) r.split()[0]은 신고한 사람이다.

    3) 신고한 사람의 id를 id_list.index() 함수에 넣어서, id_list에서 몇 번째 인덱스에 있는지 알아낸다.

    4) 찾아낸 인덱스를 기반으로 answer를 완성시켜 나간다.

 

 

 

 

728x90
반응형