hye-log

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

CodingTest/Programmers

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

iihye_ 2022. 7. 6. 13:31

0. 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/92334?language=python3 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 설명

1) report로부터 신고자 id와 신고 대상 id를 받아서 신고 횟수 누적 & 신고자 기록

2) k번 이상 신고된 아이디를 신고해서 메일을 받아야 하는 신고자 구하기

3) 이용자 id 별로 메일 받아야 하는 구하기

 

2. 입출력

# input
id_list = ["muzi", "frodo", "apeach", "neo"]
report = ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]
k = 2

# output
result = [2,1,1,0]

 

3. 코드

1) 첫 번째 코드

def solution(id_list, report, k):
    # id_list : 이용자 id 배열
    # report : 신고한 id 배열
    # k : 기준이 되는 신고 횟수

    answer = []

    id_count = [0 for i in range(len(id_list))]      # id_count : 신고 횟수
    report_list = [[] for i in range(len(id_list))]  # report_list : 누가 신고했는지
    id_mail = [0 for i in range(len(id_list))]       # id_mail : 결과 메일 횟수

    # report에서 신고 횟수 누적 & 신고자 기록
    for i in range(len(report)):
        report_who = report[i].split(' ')[0]         # report_who : 신고자
        report_id = report[i].split(' ')[1]          # report_id : 신고 대상 id

        for j in range(len(id_list)):
            if report_id == id_list[j]:                # 신고 대상 id와 id_list 가 같으면
                if report_who not in report_list[j]:    # 신고자가 최초 신고자면
                    report_list[j].append(report_who)   # 신고자 이름 기록
                    id_count[j] += 1                    # 신고 횟수 1 누적

    # k번 이상으로 정지된 아이디를 신고해서 메일 받아야 하는 사람 반환
    list_mail = []
    for i in range(len(id_list)):
        if id_count[i] >= k:
            list_mail = list_mail + report_list[i]

    # print(type(list_mail[0]))
    # 메일 횟수 count
    for i in range(len(list_mail)):
        for j in range(len(id_list)):
            if list_mail[i] == id_list[j]:          # 이용자에게
                id_mail[j] += 1

    answer = id_mail

    return answer

 

실행 결과

반복문을 사용하다보니 시간 초과가 발생

조금 더 효율적인 코드 작성이 필요함

2) 두 번째 코드

def solution(id_list, report, k):
    # id_list : 이용자 id 배열
    # report : 신고한 id 배열
    # k : 기준이 되는 신고 횟수

    answer = []

    id_count = [0 for i in range(len(id_list))]         # id_count : 신고 횟수
    report_list = [[] for i in range(len(id_list))]     # report_list : 누가 신고했는지
    id_mail = [0 for i in range(len(id_list))]          # id_mail : 결과 메일 횟수

    # report에서 신고 횟수 누적 & 신고자 기록
    for i in range(len(report)):
        report_who = report[i].split(' ')[0]            # report_who : 신고자
        report_id = report[i].split(' ')[1]             # report_id : 신고 대상 id

        index = id_list.index(report_id)                # report_id를 id_list에서 찾기
        if report_who not in report_list[index]:        # 신고자가 최초 신고자면
            report_list[index].append(report_who)       # 신고자 이름 기록
            id_count[index] += 1                        # 신고 횟수 1 누적

    # k번 이상으로 신고된 아이디를 신고해서 메일 받아야 하는 사람 반환
    list_mail = []
    for i in range(len(id_list)):
        if id_count[i] >= k:                            # k번 이상 신고된 아이디
            list_mail = list_mail + report_list[i]      # 리스트에 추가

    # 메일 횟수 count
    for i in range(len(list_mail)):
        index = id_list.index(list_mail[i])             # list_mail[i]에 해당하는 index 찾아서
        id_mail[index] += 1                             # id_mail 1 증가

    answer = id_mail

    return answer

 

실행 결과

반복문보다 index를 사용하니 시간 단축

 

4. 알게된 점

1) 일정한 개수만큼 배열을 반환할 때 배열의 초기화가 필요하다

# list의 개수만큼 배열을 초기화할 때
count_list = [0 for i in range(len(list))]

2) for 문으로 index를 찾는 것보다 index 함수를 사용하면 시간을 단축할 수 있다

# a 배열에서 b를 찾을 때
index = a.index(b)

 

5. Github 링크

https://github.com/iihye/Algorithm/blob/main/Programmers/report_results.py

 

GitHub - iihye/Algorithm

Contribute to iihye/Algorithm development by creating an account on GitHub.

github.com

 

728x90
Comments