B/Coding Test
[프로그래머스] 해시 - 베스트앨범
f_s_t_k
2020. 12. 9. 16:26
문제를 풀지 못해서 앓다가 찾아본 풀이 . . . 1시간을 더 줘도 못풀었을것 같다.
가장 첫빠따로 있는 풀이를 공부해보았다.
1. 딕셔너리를 만드는 가장 기초적인 방법
d = {e:[] for e in set(genres)}
딕셔너리를 다음과 같이 만들 수 있었다.
set으로 장르를 묶었기 때문에 중복되는 원소가 없는 집합으로 for문이 돌아가면서 key값이 만들어질것이다.
그리고 value는 빈 리스트가 들어가겠고
2. sorted의 parameter인 key를 이용하자.
sorted(d, key= lambda x: sum( map(lambda y: y[0],d[x])), reverse = True)
전형적으로 sorted는 알파벳순, 가나다순 정도로 생각했는데,
역시 내장된 파라미터를 통해서 어떻게 정렬할 것인가? 에 대한 방법도 세팅을 할 수 있었다.
특히 lambda 를 이용해서 함수로 적용하는것이 신기했다.
lambda를 두번 이용해서 좀 복잡해보이는데, 차근차근 보면 그리 어렵지는 않다.
lambda의 인자에 유의해서 어떻게 적용되는지를 위주로 해석하면 좋을 것 같다.
3. 작은 조건도 철저하게
min(len(temp),2)
min을 이용해서 만약 1글자가 나왔을때를 대비해주었다.
만약 내가 코딩했으면 if문으로 temp의 len이 1이 되는 경우를 따로 빼줬을텐데,
이런 방법이 더 효율적인 코드로 보인다
4/20 다시 문제를 풀고 난 풀이
def solution(genres, plays):
answer = []
temp = {}
for i,j in zip(genres, plays):
if i in temp.keys():
temp[i] += j
else:
temp[i] = j
li = [i[0] for i in sorted(temp.items(), key=lambda x: x[1], reverse=True)]
k = [(i,j) for i,j in zip(genres,plays)]
for gen in li:
cand = []
for num, dic in enumerate(k):
if dic[0] == gen:
cand.append((num, dic[1]))
cand = sorted(cand, key=lambda x: -x[1])
if len(cand)==1:
answer.append(cand[0][0])
else:
answer.append(cand[0][0])
answer.append(cand[1][0])
return answer