https://school.programmers.co.kr/learn/courses/30/lessons/92334
신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.
이용자의 ID가 담긴 문자열 배열 id_list, 각 이용자가 신고한 이용자의 ID 정보가 담긴 문자열 배열 report, 정지 기준이 되는 신고 횟수 k가 매개변수로 주어질 때, 각 유저별로 처리 결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution 함수를 완성해주세요.
- 유저 id에 해당하는 신고 횟수와 메일 받을 횟수를 구해야 하기 때문에 딕셔너리를 활용하면 괜찮겠다고 생각했다.
- Key 값에 유저 id, Value 값에 신고 횟수와 메일 받을 횟수를 0으로 초기화시킨 딕셔너리를 생성하였다.
- 동일한 유저에 대한 신고 횟수는 1회로 처리되기 때문에 set 자료구조를 통해 중복을 제거해 주었고, 반복문을 통해 report의 원소에 접근하였다.
- "문자열 문자열"로 이루어진 원소를 split() 함수를 통해 분리한 x를 new_report에 append() 시켜주었다.
- x의 1번째 인덱스값은 '신고를 당한 사람'이므로 앞서 선언한 딕셔너리에 해당 Key 값의 Value를 +1 해주었다.
- 반복문과 조건문을 통해 신고 당한 횟수가 k보다 큰 id를 신고한 id의 메일 받을 횟수를 +1 해주었다.
- dic1(신고 당한 횟수)에서 Value 값이 k보다 큰 Key 값을 dic2(메일 받을 횟수)에서 찾아 해당하는 Key 값의 Value를 증가시켰다.
- dic2(메일 받을 횟수)의 Value 값을 리스트로 리턴시켜주었다.
코드
def solution(id_list, report, k): dic1 = dict.fromkeys(id_list, 0) # 신고 당한 횟수 dic2 = dict.fromkeys(id_list, 0) # 메일 받을 횟수 new_report = [] for i in set(report): x = i.split(' ') new_report.append(x) # 신고 목록 dic1[x[1]] += 1 # 신고 당한 횟수 for i in range(len(new_report)): if dic1[new_report[i][1]] >= k: dic2[new_report[i][0]] += 1 return list(dic2.values())
결론부터 말하자면 문제 해결에는 성공했지만 프로그래머스 점수를 3점밖에 못받은 풀이이다. 나는 당연히 딕셔너리를 이용해 푸는 것이 가장 괜찮을 것 같다고 생각했다. 하지만 아니었다.
다른 사람의 풀이를 보니 굳이 딕셔너리를 사용하지 않아도 index() 함수를 이용해 충분히 풀 수 있는 문제였다. 하지만 나는 딕셔너리를 사용해 풀어야겠다는 생각으로 시작한 문제였기 때문에 절대 그 방법을 생각하지 못했던 것 같다.
문제 해결에는 성공했지만 나의 단점을 찾을 수 있었고, 나의 단점을 극복해나가는 과정이라 생각되는 문제였다.