문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/92334
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
구현 과정
설계 과정
신고할 경우 정지당한 사람에게 메일이 가는 것이 아니라
신고한 사람에게 당신이 신고한 사람이 정지가 되었다고 메일이 가야하는 구조
자료구조는 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 |