[프로그래머스] 신고결과받기 (2022 KAKAO BLIND RECRUITMENT)
문제
코딩테스트 연습 - 신고 결과 받기
문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의
programmers.co.kr
풀이
소스코드
def solution(id_list, report, k):
answer = []
id_dict = dict()
id_n = len(id_list)
report_n = len(report)
for i in range(id_n):
id_dict.update({id_list[i]: i})
for i in range(id_n):
answer.append(0)
check_dict = dict()
mid_ans = [0 for _ in range(id_n)]
for i in range(report_n):
a, b = report[i].split(' ')
if check_dict.get(report[i]) is not None:
continue
else:
check_dict.update({report[i]: 0})
mid_ans[id_dict[b]] += 1
for i in range(id_n):
if mid_ans[i] < k:
mid_ans[i] = 0
for i in check_dict:
a, b = i.split(' ')
if check_dict[i] == 0 and mid_ans[id_dict[b]] > 0:
answer[id_dict[a]] += 1
check_dict[a+ " " +b] += 1
return answer
풀이과정 ( 접근과정 )
오랜만에 문제를 풀려고 하다보니 파이썬 문법들이 자세하게 기억이 안나 리스트를 사용해서 풀었다.
답은 나왔었지만, 3개정도가 시간초과가 나서 다른 방식으로 풀어야겠다는 생각을 했다.
그래서 파이썬의 dictionary 문법을 사용해 id_list에 있는 이름들에 숫자를 지정해주고, report 리스트를 검색해서 check_dict에 중복이 발생하는지 확인해가면서 넣어주면서 mid_ans 리스트에 신고당한 횟수를 각 이름에 맞게 1씩 더해주었다. 그리고 mid_ans리스트에서 k만큼의 수를 충족시키지 못했을 경우 0으로 초기화 해준 후, 다시 check_dict를 하나씩 검사해나가면서 answer 리스트에 해당하는 이름에 1씩 더해주어 문제를 풀었다.
아쉬운점
문제를 맞추고, 다른 사람들이 푼 코드들을 살펴보니 내가 놓친 문법들이 많다는 것을 깨달았다.
나보다 코드가 간결하고 훨씬 가독성이 높아 배울 점이 많아 보였다.
DICT선언
reports = {id : 0 for id in id_list}
dict 선언할때 미리 id를 넣어서 지정해줌으로써 코드의 길이를 줄이고, 시간을 줄일 수 있게 됨
SET함수 사용
set(report)를 통해 중복이 되는 경우들을 제거 함으로써 코드가 더욱 간결해진다.
list.index()함수사용
index값을 바로 가져와 사용하여, 내가 짰던 id_dict 변수를 사용한 방식보다 더 빠르다고 생각.
피드백 후 코드
def solution(id_list, report, k):
answer = []
n = len(id_list)
for i in range(n):
answer.append(0)
reports = {id: 0 for id in id_list}
for i in set(report):
i = i.split(' ')
reports[i[1]] += 1
for i in set(report):
i = i.split(' ')
if reports[i[1]] >= k:
answer[id_list.index(i[0])] += 1
return answer
확실히 코드들이 어떤 역할을 하는지 좀 더 쉽게 알 수 있었다.
후기
레벨1짜리 문제이기 때문에 많이 쉬울 것 같았지만, 거의 반년동안 쉬다가 풀어서 그런지 생각대로 잘 되지는 않았다.
나중에는 이런문제들이 확실히 쉽다고 느껴지겠지만, 그래도 문제풀이는 남기려고 한다. 나중에 내가 이 문제를 다시 풀어보면 또 다른 방식으로 문제를 풀거라고 생각하기 때문에 그때 이 글을 다시본다면 분명 도움이 될 거라고 생각한다.