728x90
문제 설명
문제 풀이 과정
- 처음 문제를 보자마자 든 생각은 report를 set 처리하자! 였다.. 아무래도 중복을 먼저 처리하는 것이 가장 관건이라고 생각했다.
- 그 다음은 각 신고를 신고자 별로 dictionary형태로 만드는 것. 중복이 없으니 key를 신고자, value 값을 신고당한 사람으로 list로 만든 후 append 하는 것으로 결정함.
- 이제 신고 당한 횟수를 count해야 하는데, stop이라는 list를 만들어서 신고당한 사람을 넣었고, 그 중 k회 이상 신고당한 사람만 남도록 했다.
- 이제 dictionary에 있는 신고자와 신고 당한 사람을 각각 items로 풀어서 신고당한 사람이 stop에 있으면 count에 + 1 할 수 있도록 했다.
from collections import defaultdict
def solution(id_list, report, k):
answer = []
stop = []
report = set(report)
set_id = defaultdict(set)
for i in id_list:
set_id[f'{i}'] = []
for i in report:
a = i.split(' ')
set_id[a[0]].append(a[1])
stop.append(a[1])
stop = [i for i in set(stop) if stop.count(i) >= k]
for i, k in set_id.items():
count = 0
for j in k:
if j in stop:
count += 1
answer.append(count)
return answer
효율성이 약간 간당간당했는데.. 그래도 통과했다.. 이리저리 구조를 생각 많이 했다.
다른 사람 풀이
- id_list만큼 answer를 0으로 채우기
- id_list를 key, 0을 value로 채운 dictionary 만들기
- report 중복 제거 후 공백으로 나눈 후에, 신고 당한 사람을 +1 하기
- dictionary에서 value가 k회 이상인 값들 중 answer에 index 위치에 +1 해주기
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
이렇게까지 할 수 있구나..싶다..^^
- coding test url:
https://school.programmers.co.kr/learn/courses/30/lessons/92334
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
728x90
'Coding test' 카테고리의 다른 글
[Programmers] 할인 행사 (0) | 2022.12.20 |
---|---|
[2021 Dev-Matching] 로또의 최고 순위와 최저 순위 (0) | 2022.12.19 |
[KAKAO TECH INTERNSHIP 2022] 성격 유형 검사하기(python) (0) | 2022.12.16 |
[Programmers] 숫자 짝꿍 (0) | 2022.12.12 |
[Programmers] 삼총사 (0) | 2022.12.12 |