문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/92334
구현 과정
설계 과정
신고할 경우 정지당한 사람에게 메일이 가는 것이 아니라
신고한 사람에게 당신이 신고한 사람이 정지가 되었다고 메일이 가야하는 구조
자료구조는 dictinary를 기반으로 가져가는 것이 좋을듯함.
d_list로 for문을 돌려 딕셔너리를 생성한다.
report를 한바퀴 돌려서(신고당한 사람에 초점을 맞춘다) 각 사람별 신고된 횟수를 저장한다.(중복 신고되지 않게 해야함)
report를 한번 더 돌려서(신고한 사람에 초점을 맞춘다) 신고한 사람이 정지되었다면 result에 카운트를 증가시킨다.
틀린 코드
- 초기 구현한 코드이다. 테스트는 통과했지만 실제 제출에서 거의 다 틀린 코드이다.
- 반복문이 많이 사용되었기에, 좋지 않은 코드기도 하고, 어느부분에서 틀렸는지 파악이 어려운 코드이다.
def solution(id_list, report, k):
answer = {}
report_check = {}
for i in id_list:
answer[i] = 0
report_check[i] = [0 for i in range(len(id_list))]
for j in report:
report_check[j.split()[1]][id_list.index(j.split()[0])] = 1
for j in report:
if sum(report_check[j.split()[1]]) >=k:
answer[j.split()[0]] +=1
return list(answer.values())
맞춘 코드
풀이 방법에 대해 고민하다 떠올리지 못하여 다른사람의 코드를 확인해봤다.
set을 사용하여 중복처리를 한다는 개념만 주워서 코드를 작성해봤다.
def solution(id_list, report, k):
answer = {i : 0 for i in id_list}
check = {i : 0 for i in id_list}
for j in set(report):
x,y = j.split()
check[y] +=1
for t in set(report):
x,y = t.split()
if check[y] >=k:
answer[x] +=1
return list(answer.values())
다른 사람의 풀이
이 코드의 아이디어를 보고 작성했다 보니 나의 코드와 거의 유사함을 볼 수 있다. 내 코드보다 더 간결한 느낌이다.
def solution(id_list, report, k):
answer = [0] * len(id_list)
reported = {x: 0 for x in id_list}
for r in set(report):
a,b = r.split()
reported[b] += 1
for r in set(report):
a,b = r.split()
if reported[b] >= k:
answer[id_list.index(a)] += 1
return answer
'알고리즘 문제 풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 피로도 - python[DFS] (3) | 2023.07.27 |
---|---|
[프로그래머스] 숫자 문자열과 영단어 - python[문자열] (2) | 2023.07.10 |
프로그래머스 정수 삼각형 (0) | 2023.04.10 |
프로그래머스 점프와 순간 이동 (0) | 2023.03.31 |
프로그래머스 구명보트 파이썬 (0) | 2023.03.28 |