본문 바로가기

코딩테스트

[코딩테스트][프로그래머스] 신고 결과 받기

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

 

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

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

programmers.co.kr

 

def soultion(id_list , report, k):
    answer=[]
    return answer

주어지는 입력값으로 리스트 id_list , report와 정수 k 값이 주어진다.

 

예시를 살펴보면

결과값은 모든 유저의 신고처리된 메일의 갯수가 0을 포함해서 리스트로 나온다. answer리스트의 길이가 유저의 수와 같다.

def soultion(id_list , report, k):
    answer = [0]*len(id_list)
    return answer

 

두 번째 예시를 보면 유저1이 유저 2를 몇 번을 신고해도 유저 2의 신고처리는 1회에 그친다.

따라서 report의 중복을 없애자

def soultion(id_list , report, k):
    answer = [0]*len(id_list)
    report = set(report)
    return answer

그렇다면 예시 2로 보는 report는

더보기

["ryan con", "ryan con", "ryan con", "ryan con"]

에서

더보기

["ryan con"]

와 같이 중복이 제거된다.

 

또 report의 갯수는 최소

예시 1을 보면 report의 값 중 공백을 제거해서 리스트에 저장한 것 중 인덱스 0은 신고한 user1, 인덱스 1은 신고당한 user2이다.

for i in report :
    user1=i.split()[0]
    user2=i.split()[1]
더보기

["muzi frodo", "apeach frodo", "frodo neo", "muzi neo", "apeach muzi"]

def soultion(id_list , report, k):
    answer = [0]*len(id_list)
    report = set(report)
    reports = {x:0 for x in id_list}
    
    for i in report :
        reports[i.split()[1]] += 1
        
    return answer

reports은 모든 유저가 기본값 0으로 (신고당한 횟수인) 값을 가지는 딕셔너리를 만든 것이다. 

 

위의 예시 리스트를 참고하면 

첫 번째에서 frodo의 값은 기본값이던 0에서 1로 변했고

두 번째에서 frodo의 값은 이전 값이던 1에서 1 증가한 2로

세 번째에서 neo의 값은 기본값이던 0에서 1로 변했고

네 번째에서 neo의 값은 이전 값 1에서 1증가한 2

마지막에서 muzi의 값은 0에서 1로

바뀌어 reports 딕셔너리에 저장된다.

 

여기서 세번째 인자 k 보다 크거나 같아야 신고처리가 되므로 if 조건문을 사용한다.

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

 

신고한 유저1의 이름을 가지는 리스트의 인덱스가 answer의 인덱스안에서 1씩 증가한다.