나의 개발일지

[프로그래머스] [KAKAO] Lv.1 신고 결과 받기 [Python, 파이썬] 본문

프로그래머스

[프로그래머스] [KAKAO] Lv.1 신고 결과 받기 [Python, 파이썬]

YoonJuHan 2023. 4. 10. 22:54
  • 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/92334
  • 2022 KAKAO BLIND RECRUITMENT 문제
  • 🔑 : set()
  • 처음에는 중복 방지를 위해 체크하는 리스트를 생성하고 (신고자, 범죄자)의 형태로 체크 배열에 append 하고 not in으로 검사하는 방법을 선택했다.
  • 정답은 나오지만 몇몇 케이스에서 시간 초과가 발생
  • set 자료구조의 특성(중복되는 값이 없음)을 이용해 set(report)를 해서 중복을 제거하는 방법 사용
  • 시간 초과 해결!
  • ⛔ set 사용 주의점 : 중복 제거하기에는 굉장히 편리하지만 자료의 순서가 뒤바뀐다. 그래서 이런 문제처럼 중복을 제거하지만 자료의 순서가 의미가 없을 때 사용하는 것을 추천, 아니면 다시 순서를 정렬해야 하기 때문에...
def solution(id_list, report, k):
    신고현황 = {id : [] for id in id_list} # 신고 받은 사람들, 범죄자 : ['신고자'...]
    메일 = {id : 0 for id in id_list}   # 받을 메일의 개수
    세트 = set(report)  # 한 사람이 같은 사람을 여러 번 신고해도 신고횟수는 1번이라서 중복을 제거

    for i in 세트: # 중복 제거된 세트를 순회
        신고자, 범죄자 = i.split(" ")   # 하나의 문자열을 공백 기준으로 둘로 나눈다.
        신고현황[범죄자].append(신고자)  # 신고를 받은 사람에게 신고자 이름 추가

    for key in 신고현황:    # 신고 현황을 순회
        if len(신고현황[key]) >= k: # 신고받은 횟수(위에서 append된 횟수)가 k 이상이면
            for value in 신고현황[key]: # ['신고자'...] 형태의 범죄자의 신고 기록을 순회 
                메일[value] += 1 # 신고자에게 보낼 메일 1 증가

    return list(메일.values())  # 메일 딕셔너리의 value값을 리스트 형태로 리턴
Comments