[Python] 신고 결과 받기
코딩테스트 합격자되기 파이썬 편- 문제 24
문제 > https://school.programmers.co.kr/learn/courses/30/lessons/92334
✅ 문제 접근
- 문제 예시처럼 유저 ID, 유저가 신고한 ID, 정지된 ID에 대한 정보가 필요
- 정지된 ID는 유저가 신고한 ID 중에서 신고 횟수가 2회 이상인 ID
- 유저가 동일한 유저를 여러 번 신고할 때는 신고 횟수를 1회로 제한
✅ 기능
- report로 유저 ID와 유저가 신고한 ID, 유저 ID와 신고 당한 횟수에 대한 정보 만들기
- 중복 신고는 제외해야 함
- 신고 당한 횟수가 k 번 이상이라면 신고한 유저에게 +1을 적용
✅ 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def solution(id_list, report, k):
answer = []
dic= {} # 키: 유저 ID, 값: 유저가 신고한 ID
rpNumDic= {} # 키: 유저 ID, 값: 신고당한 횟수(중복 제외)
for r in report:
cmd= r.split(' ')
if cmd[0] in dic:
if cmd[1] in dic[cmd[0]]: # 중복 신고 한 경우
continue
else:
dic[cmd[0]].append(cmd[1])
else:
dic[cmd[0]]= [cmd[1]]
rpNumDic[cmd[1]] = rpNumDic.get(cmd[1], 0) + 1
for uid in id_list:
cnt= 0
if uid in dic:
for i in dic[uid]:
if rpNumDic[i]>= k:
cnt+= 1
else:
continue
else:
cnt= 0
answer.append(cnt)
return answer
✅ 회고
-
초기 구현 코드는 {유저 ID: 유저가 신고한 ID 리스트}의 딕셔너리와, {유저 ID: 신고 당한 횟수} 의 두 딕셔너리를 만들었다. 그리고 id_list를 돌면서 해당 유저가 신고한 ID들이 k번 이상 신고 당하였으면 cnt를 1씩 늘려 answer 배열을 완성시켰다. 로직 자체는 괜찮았던 것 같다!
코드를 제출하고 다른 사람의 코드를 보니 중복 신고 제거를 set으로 구현하였다. 처음에 문제를 풀 때 동일한 유저 신고는 제한된다는 것을 보고 set를 떠올리긴 했지만 막상 코드에 적용시키지는 못했다. 코드를 모두 살펴보고 나니 어차피 동일 신고는 report 자체가 똑같기 때문에 set만 한 번 적용하면 중복에 대한 예외 처리는 더 이상 신경 쓰지 않아도 됐다는 것을 깨달았다. 허허;;
그리고 주저리주저리 tmi 를 달자면 문제를 풀 때 당연히 문제 자체에 집중하는 것이 좋다고 생각한다. 그런데 생각한 것 이상으로 주어진 값들을 효율적으로 관리하여서 특정 형태의 답을 도출하는 것도 중요하다고 느꼈다. 효율적으로 관리할 수 있는 대상은 코드 뿐만이 아닌 데이터도 포함이라는 것…을 점차 깨닫고 있는 중이다.😿 물론 저 두 대상도 결국 관련이 있다는 것 또한 말이다. ㅎㅎㅎ ;;
This post is licensed under CC BY 4.0 by the author.