728x90

출처: 프로그래머스

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

 

 

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

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

programmers.co.kr

def solution(id_list, report, k):
    answer = [0] * len(id_list)
    cnt = {id:0 for id in id_list} # id 별 신고된 횟수
    d = {id:[] for id in id_list} # 이용자 id 가 신고한 id들 딕셔너리

    for repo in set(report):
        rep = repo.split(' ') # 이용자id와 신고한 id 분리
        d[rep[0]].append(rep[1]) # 딕셔너리에서 이용자 id 키에 신고한 id들 추가
        cnt[rep[1]] += 1 # 신고횟수

    # print(d)
    for key,values in d.items():
        for val in values:
            if cnt[val] >= k: # 신고횟수가 k번 이상이면
                answer[id_list.index(key)] += 1
    # print(answer)
    return answer

풀이 

딕셔너리를 사용해 풀이했다.

문제 풀이에 필요한 딕셔너리와 답 배열이다.

이용자와 신고한 id가 같아서 헷갈리기에 정리를 잘 하고 코딩을 하자.

 

  • d = { 이용자 id : [신고한 id들...]}
  • cnt = { 신고당한 id : 신고당한 횟수 }
  • answer = [ id_list 순서대로 k번 이상 신고당한 유저를 신고한 회원들에게 메일 보낸 횟수 +1 ]

 

  • 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
    • 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
    • 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.

이 조건에서 한 유저가 한 유저를 계속 신고하는 것은 1회로 처리하기에 set(report)를 해준다.

이는 테스트케이스2를 보고 이해하면 된다.

 

공백 기준으로 set(report)를 잘라주고 만들어둔 d 딕셔너리에 삽입한다.

또, cnt 딕셔너리에 신고당한 id 별 신고 횟수를 적는다.

모두 딕셔너리에 넣고, cnt 딕셔너리에서 k번 이상 신고당한 유저들을 신고한 유저인 d 딕셔너리의 key를

answer에서 메일 보낸 횟수 +=1 해준다. 

 


* 딕셔너리 작성

cnt = {id:0 for id in id_list} # id 별 신고된 횟수
d = {id:[] for id in id_list} # 이용자 id 가 신고한 id들 딕셔너리

말이 쫌 길긴 하지만, 충분히 풀 수 있다.

카카오 2022 블라인드 코딩테스트 채용 문제라고 한다. 

+ Recent posts