본문 바로가기

코딩

[파이썬] 코딩테스트 연습 - 신고 결과 받기

반응형

문제는 이미 여러분이 충분히 보고 오셨을 거라고 생각합니다.

문제 설명에서 문제 풀이에 중요한 조건만 먼저 설명한 뒤에 코드를 풀이하겠습니다.

 

- 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.

  : 신고 횟수에 제한은 없습니다.

  : 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.

 

- k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.

  : 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.

 

- report의 원소는 "이용자id 신고한id" 형태의 문자열입니다. 예를 들어 "muzi frodo"의 경우 "muzi"가 "frodo"를 신고했다는 의미입니다.

 

-id는 알파벳 소문자로만 이루어져 있고 id 사이에 공백은 한 칸만 있습니다.

 

-자기 자신을 신고하는 경우는 없습니다.

 

def solution(id_list, report, k):
    report = list(set(report)) # 리스트의 순서는 중요하지 않으니 set으로 중복을 제거합니다.
    answer = [0]*len(id_list) # id_list의 길이 만큼 원소가 0으로 채워진 answer 리스트를 만듭니다.
    l=[]
    d = {} # d는 신고 당한 횟수를 담기 위해 만들었습니다.
    t={} # t는 신고한 사람을 담기 위해 만들었습니다.
    for i in range(len(id_list)):
        d[id_list[i]]=0
        t[id_list[i]]=0
    #print(d)와 print(t)의 결과로 {'muzi': 0, 'frodo': 0, 'apeach': 0, 'neo': 0}이 나옵니다.
    for i in range(len(report)):
        report[i] = report[i].split()
        #report[i]의 원소를 split() 메소드를 활용하여
        원래는 frodo neo인 것을 ['frodo', 'neo'] 형식으로 바꿔줍니다.
        
        d[report[i][1]]+=1
        #report[i][1]의 예로 ['frodo', 'neo'] 중 neo만 뽑도록 합니다.
        #d[neo]+=1을 통해 네오의 신고 횟수를 증가시킵니다.
    
    for i, j in d.items():
        if j >= k:
            l.append(i)
        #k회 이상 신고받은 경우 리스트 l에 신고받은 이름을 추가합니다.
    for i in range(len(report)):
        for j in l:
            if report[i][1] == j:
            # 리포트에서 리스트 l에 해당하는 이름이 있는 경우
                t[report[i][0]]+=1
                #신고한 사람에게 처리 결과 메일이 가는 횟수를 추가해줍니다
    return list(t.values())
    # t의 값만 리스트로 리턴합니다.

 

도움이 되셨길 바랍니다.

반응형