Just Fighting
[프로그래머스] 신고 결과 받기 본문
728x90
https://programmers.co.kr/learn/courses/30/lessons/92334
<문제 설명>
한 번에 한 명씩 신고 가능. 계속 신고 가능하지만 1번으로 취급됨.
k번 이상 신고되면 계정 정지. 신고한 모든 유저에게 메일 발송. 마지막에 한꺼번에 게시판 이용정지 됨
<문제 이해>
신고 당한 횟수를 딕셔너리에 하나 넣고, 한 유저마다 신고한 유저를 딕셔너리에 저장한다.
그리고 신고당한 횟수가 k번 이상이 되면 정지 유저 리스트에 넣었다.
마지막에 각 유저가 신고한 유저가 정지유저 리스트에 있으면 카운트하는 방식을 이용하였다.
<문제 풀이>
def solution(id_list, report, k):
answer = []
count = {}
reportId = {}
stopId = set()
report = list(set(report))
for re in report: # 신고내용
user = re.split()
if user[0] not in reportId: # 신고한 유저 저장
reportId[user[0]] = [user[1]]
else:
reportId[user[0]].append(user[1])
count[user[1]] = 1 if user[1] not in count else count[user[1]]+1 # 신고된 횟수저장
if count[user[1]] >= k : stopId.add(user[1]) # 신고 k번 이상된 사람 저장
for user in id_list: # 각 유저마다 신고한 유저 중 정지유저 카운트
tmp = 0
if user in reportId:
for u in reportId[user]:
if u in stopId: tmp += 1
answer.append(tmp)
return answer
<풀이 개선>
다른 사람들이 푼 방식을 보다가 다른 풀이 방법을 사용하는 것이 좋겠다고 생각했다.
나는 각 유저가 신고한 사람을 저장하는 방식을 사용했는데,
그것이 아닌 신고 당한 유저를 key로 저장하고 신고한 유저를 value로 저장하는 것이다.
이렇게 하면 신고한 유저의 수가 k개 이상인 사람을 신고한 사람들한테만 메일을 보내면 되는 거니까!
그리고 딕셔너리를 미리 만들어 놓고 딕셔너리에 속하지 않았을 때 써야하는 코드들을 삭제했다.
마지막으로 딕셔너리의 values() 함수를 이용하여 정답이 담긴 배열을 이용하였다.
def solution(id_list, report, k):
report = list(set(report))
count = {user:0 for user in id_list}
reportUser = {user:[] for user in id_list}
for re in report:
user = re.split()
reportUser[user[1]].append(user[0])
for ru in reportUser:
if len(reportUser[ru]) >= k:
for user in reportUser[ru]:
count[user] += 1
return list(count.values())
728x90
'Algorithm > 코딩테스트 연습' 카테고리의 다른 글
[프로그래머스] 주차 요금 계산 (0) | 2022.01.19 |
---|---|
[프로그래머스] k진수에서 소수 개수 구하기 (0) | 2022.01.18 |
[프로그래머스] 크레인 인형뽑기 게임 (0) | 2022.01.13 |
[프로그래머스] 키패드 누르기 (0) | 2022.01.12 |
[프로그래머스] 숫자 문자열과 영단어 (0) | 2022.01.11 |
Comments