[프로그래머스 Lv1. 신고 결과 받기 - 파이썬] dictionary 이용 문제 풀이 (내 풀이, 모범 풀이 비교)
미국여행 후 정말 오랜만에 푸는 거라 dictionary 문법도 다 까먹어서 구글링을 통해 고심하며 푼 나의 코드..
시간초과 날 것 같은데 걱정하며 돌렸지만 그래도 통과는 했다.
그치만 아무리 봐도 맘에 들지 않는 코드
모범 답안을 분석해봐야겠다. 나도 저렇게 효율적인 코드를 짤 수 있도록..!
내 풀이
def solution(id_list, report, k):
answer = []
p_dict = {} # {'신고한 유저': ['신고 당한 유저']}
declared = {} # 신고 당한 유저 {'name': num}
for idl in id_list:
p_dict[idl] = ''
declared[idl] = 0
for r in report:
p1, p2 = r.split()
if p2 in p_dict[p1]: # 이미 존재할 경우
continue
else:
old = p_dict.get(p1)
if old == '':
p_dict[p1] = [p2]
else:
old.append(p2)
p_dict[p1] = old
# print('p_dict', p_dict)
for arr in p_dict.values():
for a in arr:
declared[a] += 1
filter_declared = dict(filter(lambda x:x[1]>=k, declared.items())).keys() # k 횟수로 필터링
# print(filter_declared)
for p in p_dict:
ans = 0
for f in filter_declared:
if f in p_dict[p]:
ans += 1
answer.append(ans)
return answer
그래도 일단 이 문제를 풀며 dictionary 문법에 대해 다시한번 공부했다.
우선 k 횟수로 필터링하는 부분
dict() : 새로운 dictionary 만듦
filter() : 조건을 통해 필터링
declared.items() : 딕셔너리 items() 함수를 쓰면 key, values 쌍을 얻는다.
lambda x:x[1]>=k : items()에서 얻은 key, values 쌍에서 인덱스 1의 값, 즉 values 값이 k 이상인 것
.keys() : 딕셔너리 keys() 함수는 keys의 배열을 얻는다.
또 다시 한번 알게된 점
dictionary = {'a': 1, 'b': 2}
이렇게 있고, dictionary[b]에 3을 추가하고 싶다?
그러면 무심코 dictionary[b] = 3 이라는 코드를 작성할 수 있는데, 이러면 {'a': 1, 'b': 3} 으로 업데이트된다.
이 때문에 old 배열을 선언해서 append로 추가한 다음 다시 value를 넣어주었다.
dictionary.get(a) : a라는 key의 values를 반환
dictionary[a] : 얘도 get과 같은 역할
둘의 차이점은 존재하지 않는 key를 불러올 때 어떻게 반환하는가 이다.
dictionary.get(a) 은 None을, dictionary[a]은 에러를 반환한다.
안전하게 get()을 쓰는 것이 좋을 것 같다.
모범 풀이
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
우선 초기 선언부터 for문을 이용하지 않고 len()으로 간단하게 해주었다.
이건 빠르게 습득하도록 하자.
set(report)로 간단히 중복을 제거해주었다.
중복이 통하지 않는다는 문제 조건을 보고 잠시 set을 떠올렸지만 실천에 행하지 않았는데 반성하게 된다.
첫번째 for문을 통해 reports라는 딕셔너리에 신고된 사람의 {'name': 횟수} 이 작성된다.
두번째 for문을 통해 신고 횟수가 k번 이상인 사람일 때,
신고한 사람 리스트인 id_list에서 index() 함수를 통해 신고한 사람의 index를 찾아
answer에서 알맞은 index 위치에 횟수를 증가시킨다.