
문제 주소: https://programmers.co.kr/learn/courses/30/lessons/92334
[ 문제 ]

[ 나의 귀여운 풀이 ]
def solution(id_list, report, k):
reportedli = []
# report를 split해 [[신고한 user id, 신고 당한 user id], ... ]로 구성
cntli = [0] * len(id_list)
# 각 user id 별 신고 누적 횟수 체크를 위한 list
suspended = []
# k 이상의 신고를 받은 user id를 저장 하기 위한 list
result = [0] * len(id_list)
# 받을 메일의 수를 id_list의 인덱스에 맞춰서 저장할 list
report = list(set(report))
# 중복을 제거하기 위해 집합자료형 set을 사용한다. set을 사용시 순서 고려 X
for i in range(len(report)):
reportedli.append(list(map(str, report[i].split())))
# reportedli[idx][0] 신고한사람, reportedli[idx][1] 신고당한 사람
for i in range(len(reportedli)):
# id 별 신고 누적 횟수 체크
idx = id_list.index(reportedli[i][1])
cntli[idx] += 1
for i in range(len(cntli)):
# chkli에서 k 이상의 값 즉, k번 이상 신고를 당한 user id를 저장
if cntli[i] >= k:
suspended.append(id_list[i])
for i in range(len(reportedli)):
# suspended id list와 reported id list를 비교해 메일을 보낼 user id에 해당하는 index에 count해준다.
if reportedli[i][1] in suspended:
idx = id_list.index(reportedli[i][0])
result[idx] += 1
return result
[ 다른 분들의 유려한 코드 ]
def solution(id_list, report, k):
answer = [0] * len(id_list)
reports = {x : 0 for x in id_list}
for r in set(report):
reports[r.split()[1]] += 1
for r in set(report):
if reports[r.split()[1]] >= k:
answer[id_list.index(r.split()[0])] += 1
return answer
[ 배운 것 ]
1. list 내 중복제거
처음에는 반복문을 두 겹으로 사용해 O(N^2) 시간 복잡도를 가진 방법으로 중복을 제거 했는데, 이 때문에 테스트에서 실패하는 케이스가 발생했다... ㅜㅜ
(1) 순서 고려 시
- for문 사용
for value in array:
if value not in result:
result.append(value)
- dict.fromkeys(arr) 사용
result = list(dict.fromkeys(array))
(2) 순서 고려하지 않을 시
- 집합 자료형 set 사용
arr = list(set(arr))
참고: https://jsikim1.tistory.com/214
2. 자료형의 적절한 사용: 다른 분들의 풀이를 보면 나처럼 신고당한 사용자의 이름과 신고 받은 횟수를 따로 list로 보관하는 것이 아니라 dictionary 자료형으로 이름을 key, 신고당한 횟수를 value로 저장해 정지당한 사용자를 판별하는데, 이렇게 되면 suspended 리스트를 또 저장할 필요 없어진댜... set, dictionary 등 자료형을 알맞게 사용하는 것도 중요하다고 느꼈다.
꾸준히 열심히!
'Otter's [ 개발새발 ] > # 코딩테스트 - Programmers' 카테고리의 다른 글
| [Programmers 코딩테스트 연습_Lv1_Python] 내적 (0) | 2022.06.03 |
|---|---|
| [Programmers 코딩테스트 연습_Lv1_Python] [카카오 인턴] 키패드 누르기 (0) | 2022.06.03 |
| [Programmers 코딩테스트 연습_Lv1_Python] 숫자 문자열과 영단어 (0) | 2022.06.03 |
| [Programmers 코딩테스트 연습_Lv1_Python] 신규 아이디 추천 (0) | 2022.05.31 |
| [Programmers 코딩테스트 연습_Lv1_Python] 로또의 최고 순위와 최저 순위 (0) | 2022.05.31 |