본문 바로가기

취업을 준비하며 정리하는 컴퓨터 지식/Problem Solving

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

728x90

신고 결과 받기 문제 설명은 다음의 링크를 참고해주시기 바랍니다. 문제 설명

 

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

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

programmers.co.kr

신고 결과 받기에는 다음의 조건들이 존재합니다.

  1. 1명의 사용자는 같은 사용자를 2번 이상 신고할 수 없다.
  2. 신고 횟수가 입력 받은 K 값보다 크다면 해당 사용자는 게시판 이용이 정지된다.
  3. 정지당한 사용자를 신고한 모든 사용자에게 처리 결과 메일이 보낸다.

위의 조건들을 만족하며 각 사용자가 받은 처리 결과 메일의 횟수를 return 하는 것으로 문제를 해결할  수 있습니다.

 

다음은 조건들을 만족하며 문제를 해결하는 순서입니다.

  1. report의 중복을 제거하고, 신고자와 신고 당한 사용자로 나눈다.
  2. report를 순환하며 나를 신고한 이용자의 id를 report_dict에 저장한다.
  3. report_dict의 key 값을 순환하며 report_dict[key]의 길이가 k가 이상인지 확인한다.
  4. 3의 조건이 참이라면 report_dict[key](나를 신고한 이용자) 값을 순환하며 answer_dict(내가 받아야 할 메일 개수)를 1씩 증가시킨다.
  5. 3의 조건이 거짓이라면 3을 반복한다.

해결 순서를 코드로 작성하면 다음과 같습니다.

 

def solution(id_list, report, k):
  report = [item.split() for item in list(set(report))]
  answer_dict = {id:0 for id in id_list}
  report_dict = {id:[] for id in id_list}

  for reporter, target in report:
    report_dict[target].append(reporter)

  for key in report_dict.keys():
    if len(report_dict[key]) >= k:
      for value in report_dict[key]:
        answer_dict[value] += 1
  
  return list(answer_dict.values())

 

report에 set을 사용한 이유는 1명의 사용자는 같은 사용자를 2번 이상 신고할 수 없다는 조건을 만족하기 위해서 입니다. 입출력 예시에서도 ["ryan con", "ryan con", "ryan con", "ryan con"] 과 같이 ryan이라는 사용자가 con을 4번 신고한 예시가 존재합니다. 이 신고들은 첫 번째 "ryan con"을 제외하고는 전부 유효하지 않은 신고입니다. 해당 값들을 처리해주지 않는다면 report_dict에 정확한 신고자들의 id가 들어갔다고 보장할 수 없습니다.

 

유효하지 않은 값을 처리하기 위해서는 중복 제거를 해주면 됩니다. 이때 사용할 수 있는 개념이 바로 set입니다. set을 사용하면 원소의 중복을 허용하지 않는 set의 특성 때문에 위의 4개의 신고가 다음과 같이 1개의 신고로 바뀌게 됩니다. ["ryan con"]

 

결과적으로 report에는 전부 유효한 신고가 저장됩니다.

728x90