티스토리 뷰
https://programmers.co.kr/learn/courses/30/lessons/42579
코딩테스트 연습 - 베스트앨범
스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 ��
programmers.co.kr
{'classic': [(0, 500), (2, 150), (3, 800)], 'pop': [(1, 600), (4, 2500)]}
- 이런
dictionary
를 만드려고 꽤나 고생했다. - list에 tuple 원소를 추가할 때, 평소에 하듯이
dict.get(key, [])
를 쓰려니까[0, 500, 2, 150, ..]
이런 식으로 추가가 되었다. - 그래서 그냥
dict.keys()
에key
가 있는 경우, 없는 경우를 분리해서list.append((i, v))
로 넣었다.
- 이런
- 정렬을 위해서 dict를 list 화 할 때 자꾸
dict.items()
함수의 존재를 까먹는다. 삽질하지 말고 이용하자.dict.items()
도 정렬할 수 있다. - 런타임 에러가 나서 생각해보니, 같은 장르 내에서 두개 까지만 수록하는데, 한 장르에 한 장르만 있을 경우를 고려하지 않아서 당연히 에러가 났다. if 문으로 경우 분리하니 드디어 해결!
- 처음 코딩테스트 공부 시작할 때는 못푼 문제였는데 풀어내서 기분 좋다 ㅎㅋ
def solution(genres, plays):
answer = []
gd = dict()
pd = dict()
for g, (i, p) in zip(genres, enumerate(plays)):
gd[g] = gd.get(g, 0) + p
if g in pd.keys():
pd[g].append((i, p))
else:
pd[g] = [(i, p)]
gl = sorted(gd.items(), key=lambda x: -x[1])
# {'classic': [(0, 500), (2, 150), (3, 800)], 'pop': [(1, 600), (4, 2500)]} pd
for g in gl:
pl = pd[g[0]]
pl.sort(key=lambda x: (-x[1], x[0]))
if len(pl) >= 2:
answer.append(pl[0][0])
answer.append(pl[1][0])
else:
answer.append(pl[0][0])
return answer
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
프로그래머스 level 2 - 기능개발 (스택/큐) (0) | 2020.09.14 |
---|---|
프로그래머스 level 2 - 프린터 (스택/큐) (0) | 2020.09.14 |
프로그래머스 level 2 - 위장 (해시) (0) | 2020.09.13 |
프로그래머스 level 2 - 전화번호 목록 (해시) (0) | 2020.09.12 |
프로그래머스 level 2 - 타겟넘버 (DFS/BFS) (0) | 2020.09.12 |
댓글