[프로그래머스 / Level 1] 신고 결과 받기 (파이썬)

2022. 5. 10. 13:47·🎲 알고리즘 공부/프로그래머스

📝 문제 요약

> 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 한다.

 

  규칙  

1. 각 유저는 한 번에 한 명의 유저를 신고할 수 있다. 신고 횟수 제한은 없으나 한 유저에게 여러 번 신고한 건 1회로 처리된다. (중복 신고 안됨)

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

 

이 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성하라.

 

입출력 예시

- report 부분은 신고한 사람이 앞에, 신고당한 사람이 뒤에 적혀져있다.

- 무지는 프로도와 네오를 신고했는데, 프로도와 네오 모두 2번 신고당해서 정지되었으므로 무지는 2개의 처리 메일을 받게 된다. 그래서 result 첫번째가 2인 것이다.

 

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

 

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

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

programmers.co.kr

 

🎨 풀이

💡 첫 번째 시도 = 성공 코드

 

def solution(id_list, report, k):
    answer = []
    reported_people = []        # 신고당한 사람 리스트
    stoped_people = []          # 정지된 사람 리스트 (신고당한 사람 중에서 정지된 사람)
    good_people = []            # 신고 잘 한 사람 리스트
    
    report = set(report)
    report = list(report)

    for i in range(len(report)):
        tmp = report[i].split(" ")
        reported_people.append(tmp[1])
    
    for i in range(len(id_list)):
        if reported_people.count(id_list[i]) >= k:
            stoped_people.append(id_list[i])
    
    for i in range(len(report)):
        tmp = report[i].split(" ")
        if stoped_people.count(tmp[1]) == 1:
            good_people.append(tmp[0])
    
    for i in range(len(id_list)):
        answer.append(good_people.count(id_list[i]))
        
    return answer

> 

1. set을 이용해서 report의 중복 요소들을 제거해준 후 다시 list로 바꾼다.

2. [첫 번째 for문] report에서 신고당한 사람들을 reported_people에 넣어준다.

 - report[i]를 공백으로 구분해서 tmp에 담는 것이다. 

 - tmp[0]에는 신고한 사람이, tmp[1]에는 신고당한 사람이 각각 들어간다.

 - tmp에 들어가는 문자는 계속 바뀐다. (첫 번째는 report[0], 두 번째는 report[1] 이런 식으로!)

 

3. [두 번째 for문] id_list를 기준으로, 신고당한 사람 중에서 정지된 사람들을 stoped_people에 넣어준다. (count 이용)

 - reported_people에는 신고당한 사람들 이름이 쭉 써져있다. ex)['neo', 'frodo', 'muzi', 'frodo', 'neo']

 - id_list에 있는 순서대로, stoped_people에 몇 번 써져있는지 count 하고 k와 비교한 후 넣어주던지 내버려 두던지 한다.

 

4. [세 번째 for문] 정지된 사람을 신고한 경우, 그 이름을 good_people에 넣어준다.

 - 2번과 동일하게, report[i]를 공백으로 구분한 후 tmp에 나눠 넣는다.

 - tmp[1], 즉 신고 당한 사람쪽이 stoped_people에 있는 경우 tmp[0]을 good_people에 넣는다.

 

5. [네 번째 for문] id_list를 기준으로 good_people에 들어간 횟수를 count해서 answer에 넣어준다.

 - 순서가 일치해야하기 때문에 id_list가 기준이 되는 것이다.

 - 신고를 잘 해서 정지를 준 사람 리스트가 쭉 적혀있기 때문에 그대로 count 해서 넣어주면 된다.

​끝~

 

 

⭐ 느낀점

 

> 신고당한 사람 > 정지된 사람 > 정지 시킨 사람 으로 3번 필터링 했는데, 그 과정 때문에 for문을 4번이나 쓴 게 좀 그렇다. 그래도 통과해서 다행이긴 한데 ㅎㅎ..~ 다른 사람들 코드 보니까 딕셔너리를 사용하더라! 어렵네., 그래도 푼 거에 일단 만족이다. 

'🎲 알고리즘 공부 > 프로그래머스' 카테고리의 다른 글

[프로그래머스 / Level 1] 나머지가 1이 되는 수 찾기 (파이썬)  (0) 2022.05.12
[프로그래머스 / Level 2] 짝지어 제거하기 (파이썬)  (0) 2022.05.11
[프로그래머스 / Level 1] 문자열을 정수로 바꾸기 (파이썬)  (0) 2022.05.09
[프로그래머스 / Level 1] 짝수와 홀수 (파이썬)  (0) 2022.05.08
[프로그래머스 / Level 1] 실패율 (파이썬)  (0) 2022.05.07
'🎲 알고리즘 공부/프로그래머스' 카테고리의 다른 글
  • [프로그래머스 / Level 1] 나머지가 1이 되는 수 찾기 (파이썬)
  • [프로그래머스 / Level 2] 짝지어 제거하기 (파이썬)
  • [프로그래머스 / Level 1] 문자열을 정수로 바꾸기 (파이썬)
  • [프로그래머스 / Level 1] 짝수와 홀수 (파이썬)
듬듬
듬듬
  • 듬듬
    두드림
    듬듬
  • 전체
    오늘
    어제
    • 분류 전체보기 (280)
      • 📑 신입일기 (35)
      • 🍪 Web (1)
        • angular (1)
        • JavaScript (0)
      • 🧩 Node.js 공부 (2)
      • 🎲 알고리즘 공부 (192)
        • 프로그래머스 (76)
        • 백준 (96)
        • 코드업 (19)
      • 🎨 Tistory Customizing (1)
      • 💌 일상 (12)
        • 일상 (5)
        • 기록 (7)
      • 📜 자격증 (2)
        • 정보처리기사 (2)
      • 📗 spring boot 공부 (9)
      • 학교 공부 (20)
        • ICT 개론 (14)
        • 리눅스 (6)
      • ChatGPT 랑 놀기 (0)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    일기
    codeup
    충무로
    스프링부트
    신입일기
    BOJ
    백준
    코테
    코린이
    행렬덧셈
    파이썬
    오블완
    6월 목표
    nodejs
    50문답
    카카오
    폰켓몬
    티스토리챌린지
    연습문제
    코민이
    피보나치수
    정처기
    오버워치
    컨텐더스
    til
    프로그래머스
    정보처리기사
    스프링 부트
    찬양추천
    코드업
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
듬듬
[프로그래머스 / Level 1] 신고 결과 받기 (파이썬)
상단으로

티스토리툴바