문제 - 신고 결가 받기
https://programmers.co.kr/learn/courses/30/lessons/92334
코딩테스트 연습 - 신고 결과 받기
문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의
programmers.co.kr
나의 풀이
def solution(id_list, report, k):
n = len(id_list)
id_list_num = {} # id별 인덱스 부여
new_report = set(report) #중복 제거
new_group = [[] for _ in range(n+1)] # 연결 정보 담은 배열
counting = {} # 신고 당한 수 사전
final = [] # k번 이상 신고 당한 사람 리스트
answer = [0] * n
j = 0
for i in id_list:
j += 1
id_list_num.setdefault(i, j)
counting.setdefault(i, 0)
for j in new_report:
a, b = j.split()
counting[b] += 1
for i in id_list_num:
if a == i:
num = id_list_num[i]
new_group[num].append(b)
for i in counting:
if counting[i] >= k:
final.append(i)
num = 0
for i in range(1, n+1):
for j in final:
if j in new_group[i]:
num += 1
answer[i-1] = num
num = 0
return answer
문제 해결 방법
1) Dictionary를 이용해서 문제를 해결했습니다.
2) 같은 사람이 동일인을 2번 이상 신고해도 1번으로 간주하므로 set 함수를 사용해 중복을 제거했습니다.
3) 접근을 쉽게 하기 위해 index 부여해 report를 딕셔너리(new_group) 형태로 변환하였고,
4) 이름 : 신고당한 사람 수 형태로 딕셔너리(counting)에 저장하였고,
5) k번 이상인 경우 배열(final)에 담았습니다.
5) 마지막으로, {이름 : 신고한 사람} 형태의 딕셔너리(new_group)의 value 값이 k번 이상 신고받은 사람(final)을 포함하고 있는 지 확인하였습니다.
-> 포함하고 있다면, 처리 개수를 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
나의 코드와 비교해보았을 때, 방법은 똑같았으나 코드가 훨씬 간결해 보입니다.
대표적으로 id_list에 index를 부여하는 부분을 id_list.index로 간결하게 표현할 수 있었다니..ㅎ
(for문으로 index를 부여해 새로운 딕셔너리에 담은 1인)
그외에도 내가 3줄 이상 작성한 코드가 한줄로 간결하게 나타낼 수 있는 부분이 많아서 현타가 쪼금 옵니다..
코드를 간결하게 표현할 수 있는 능력을 빠르게 습득해야겠습니다..!!!
'CodingTest' 카테고리의 다른 글
[프로그래머스] 신규 아이디 추천 (카카오 문제) (Python) (0) | 2022.06.08 |
---|---|
[백준] 2960번_에라토스테네스의 체 (Python/파이썬) (0) | 2022.05.27 |
[백준] 2343번_기타 레슨 (Python/파이썬) (0) | 2022.05.10 |
[백준] 2444번_별 찍기 - 7 (Python/파이썬) (0) | 2022.04.04 |
백준 1987번_알파벳 (Python/파이썬) (0) | 2022.03.22 |