프로그래머스 2022 KAKAO BLIND RECRUITMENT
- Lv 1. 신고 결과 받기 (Python)
https://school.programmers.co.kr/learn/courses/30/lessons/92334
def solution(id_list, report, k):
# 중복 제거 (한 유저가 같은 유저를 여러번 신고한 경우는 1회로 처리하기 위해)
report = list(set(report))
# 정답을 리턴할 answer 리스트 (id_list 만큼의 길이를 갖도록하며 0으로 초기화)
answer = [0 for _ in range(len(id_list))] # 담아야 하는 값 : id_list에 담긴 id 순서대로 각 유저가 받은 결과 메일 수
# 신고한 유저와 신고당한 유저를 저장할 딕셔너리 (key : 신고한 유저, value : 해당 유저에게 신고 당한 유저들)
reporting_dict = dict()
# 신고당한 유저들 이름만 따로 모아놓을 리스트 (몇번 신고 당했는지 세기 위해서)
# (ex.["frodo","frodo","neo","neo","muzi"])
reported_ppl = []
# 딕셔너리 초기 셋팅 (key에 각 유저 id를 넣고, value에는 빈 리스트 넣어주기)
for id in id_list:
reporting_dict[id] = []
# 딕셔너리 채우기 작업
for r in report:
key = (r.split(' '))[0] # 신고한 유저
value = (r.split(' '))[-1] # 해당 유저에게 신고당한 유저
reported_ppl.append(value)
reporting_dict[key].append(value)
# 신고당한 유저들이 id_list 인덱스 순서 기준대로 몇번 신고당했는지 기록할 리스트
# (ex. [1, 2, 0, 2] - 순서대로 ["muzi", "frodo", "apeach", "neo"] 가 신고당한 횟수)
reported_count = [0 for _ in range(len(id_list))]
# 신고당한 유저들 리스트를 토대로 id_list에 있는 id 순서대로 신고당한 횟수 ban_ppl 리스트에 기록하기
for reported_person in reported_ppl:
if(reported_person in id_list):
index = id_list.index(reported_person)
reported_count[index] += 1
# 신고당한 횟수를 기록한 리스트 reported_count를 통해 딕셔너리를 참조하여 누가 신고하였는지 찾기
# 만약 k번 이상 신고당하였다면 -> 정지 -> 신고한 사람이 처리메일을 받게됨 -> answer에 기록되어야함
for key, value in reporting_dict.items():
for i in range(len(reported_count)):
if(reported_count[i] >= k): # k번 이상 신고당하면
ban_id = id_list[i] # 이 id는 정지를 먹게됨
if(ban_id in value): # 만약 정지를 먹는 id를 신고한 적이 있다면, 처리메일을 받게 되므로 answer에 기록되어야 함
index = id_list.index(key) # 인덱스는 신고한 사람인 key 값의 id_list 위치
answer[index] += 1 # 그 사람이 메일받았으니 기록
return answer
신고한유저
- 신고당한유저
얘네를 묶어서 가져가야 나중에 처리메일을 받게 되는 사람이 누군지 알 수 있기 때문에 dictionary
를 사용하였다. 또한 한 유저가 같은 유저를 여러번 신고하면 1회로 처리되기 때문에 중복을 없애기 위해서 주어진 report
리스트를 set
으로 중복 없앤 뒤 다시 리스트로 만들어서 사용하였다.reported_count
리스트 신고당한 횟수가 k보다 크면 → 정지를 먹음 → 신고자에게 처리메일 발송됨 → answer에 기록되어야 함 이를 위해서는 정지먹는 id
가 id_list
에서 어느 인덱스에 있었는지 알아야하기 때문에 신고먹은 횟수를 각 id_list
순서대로 기록해주었다. ex. [1, 2, 0, 2]
→ 순서대로 ["muzi", "frodo", "apeach", "neo"]
가 신고당한 횟수k
보다 크면정지먹는 id
는 인덱스 위치 상 특정 id
가 나오고id
를 신고한 적이 있다면answer
에 신고자 인덱스를 기준으로 +1 해준다이렇게 하면 딕셔너리의 각각의 key와 value를 for문 하나로 접근하여 사용할 수 있다.
참고 : https://dojang.io/mod/page/view.php?id=2308
for key, value in dictionary.items():
...
++ 참고로 dictionary.items()
를 출력하면 아래와 같이 나온다.
dict_items([('muzi', ['neo', 'frodo']), ('frodo', ['neo']), ('apeach', ['frodo', 'muzi']), ('neo', [])])
→ 따라서 이를 위와 같은 for문으로 다룬다면 for문의 첫번째 값은
key == 'muzi'
value == ['neo', 'frodo']