코딩테스트/프로그래머스

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

HU_717 2023. 2. 1. 03:13

✏️ 문제  

  • k 번 이상 신고 당한 사용자를 신고한 사용자에게 메일 보내기

✏️ 조건

  • 각 유저는 한 번에 한 명의 유저만 신고 가능하다
    • 단, 신고 횟수에 제한은 없지만 동일 유저에 대한 신고 횟수는 1회로 처리된다.
  • k번 이상 신고된 유저는 게시판 이용이 정지되고, 해당 유저를 신고한 모든 유저에게 정지 사실을 보낸다.
    • id_list 순서에 맞추어 result(정지 사실 횟수)를 알린다.

✏️ 입출력 예시

 

✏️ 아이디어

  • 딕셔너리 사용하기
  • 단계별 차례대로 문제 해결해보기

1) 중복 제거

    '''1회 신고 적용'''
    report_f = set(report) # report중복 제거

동일한 유저에 대한 신고 횟수는 1회로 처리되므로 report의 중복되는 요소들을 제거해준다.

 

2) 신고 받은 사람

    '''신고 받은 횟수 비교'''
    for called_id in report_f: # 신고 받은 사람만 리스트 생성
        called_list.append((called_id.split())[1]) 

    id_dic = {id:0 for id in id_list} # id_list 딕셔너리 저장(0으로 초기화)
    for called_id2 in called_list: # 신고 받은 사람 횟수 추가 // 딕셔너리로 표현
        if(id_dic[called_id2] != None):
            id_dic[called_id2] += 1
        else:
            pass

딕셔너리를 활용하여 id_list에 있는 사람들의 값을 0으로 초기화한 후, report[i][1] 내에 신고 받은 사람의 횟수를 추가해준다.

 

3) k번 이상 신고 받은 사람

    '''k번 이상 신고 받은 사람 => 다시 리스트로 변환'''
    called_id_k = list(id_dic.keys())
    called_k = list(id_dic.values())

    idx_f = 0 # k번 이상 신고 받은 사람 index
    for num in called_k:
        if num >= k:
            called_list_k.append(called_id_k[idx_f])
        idx_f += 1

신고 받은 사람들 중 k 번 이상 신고 받은 사람의 값만 추출한다.

 

4) 신고한 사람

    '''신고 받은 사람(1차원 배열) 기준으로 신고 한 사람(2차원 배열[0]) 찾기'''
    '''신고 한 사람 찾기 // 리스트 변환'''
    report_list = list(report_f)
    for r in report_list:
        call_list.append(r.split())

신고 받은 사람의 값을 활용하여 report_f를 리스트로 변환 후 신고 한 사람의 값을 추출한다.

(* 지금 다시 보니 이 부분은 아래와 합칠 수 있지 않을까 생각이 든다.)

 

5) k번 이상 신고한 사람

    '''k번 이상 신고받은 사람을 신고한 사람 // 리스트 변환'''
    idx_f2 = 0
    for call in call_list:
        for call2 in called_list_k:
            if call2 == call[1]:
                call_list_k.append(call_list[idx_f2])
        idx_f2 += 1

신고한 사람의 값과 k 번이상 신고 받은 사람의 값을 비교하여 k번 이상 신고받은 사람을 신고한 사람을 구한다.

 

6) 신고 한 사람이 받는 메일

    '''k번 이상 신고 받은 사람만 리스트 생성 = call_list_k
        신고 한 사람이 받는 메일 수'''
    mail_dic = {id:0 for id in id_list} # id_list 딕셔너리로 0초기화
    print(call_list_k)
    for mail in call_list_k: # 신고 한 사람 겹치면 1추가
        mail = mail[0]
        if(mail_dic[mail] != None):
            mail_dic[mail] += 1
        else:
            pass

다시 id_list의 딕셔너리를 0으로 초기화 한 후, call_list_k에서 신고한 사람이 겹치면 values값을 1씩 증가시킨다.

 

✏️ 결과

 

다 풀고 나니 중복되는 부분도 많았고 하드 코딩을 한 것 같다.

다른 사람들의 풀이를 보니 길이도 짧고 len을 활용하여 더 간결하게 푼 것을 확인할 수 있었다.

딕셔너리 활용을 하다가 어려움을 겪고 리스트로 변환하는 모습을 많이 볼 수 있는데

(사실 k번 이상은 거의 다 리스트로 바꿔서 푼 것 같다.) 딕셔너리 활용법을 더 익혀야겠다.