📝 문제 요약
> 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 한다.
규칙
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 |