#7 배스트 앨범:

date posted: 2020-04-19




오늘의 TMI

  1. 현재의 감정에따라 책이 나한테 어떻게 다가오는법이 바뀌는것 같다. 감성적일땐 일본영화, 소설의 한마디한마디가 와닿았는데 요즘엔 약간 이성적이라 "...? 이건 또 뭐야" 라고 하게되네.
  2. 이번주 너무 열심히 했다...



코딩 풀이 시작

문제 설명은 아래 프로그래머스 링크에서 보세요.

#1 시도
  • genres, plays, i 를 가지고 dictionary 를 만들어 줍니다. 예시에 나와있는걸로 만들면:
    table = {'classic': [(500, 0), (150, 2), (800, 3)], 'pop': [(600, 1), (2500, 4)]}
  • (하이라이트)
    1. table.items() 는 dictionary 를 list of tuple 로 만들어 준다. [('classic', [(500,0), (150,2), (800,3)]), ('pop', [(600,1), (2500,4)]) ]
    2. list of tuple 을 sort 해준다. --> sum(x[0] for x in tup[1]) 설명:
      • 각 tuple 에 1번째 아이템을 가져온다 --> 첫번째 = [(500,2), (150,2), (800,3)]
      • tup[1] 에 있는 아이템이 또 list of tuple 이다. 0번째 아이템을 가지고 list 를 만든다 --> [500, 150, 800]
      • 만들어진 list 의 합을 구한다.
    3. 이걸 lambda 함수에 짚어 넣어 만들어진 list 의 합으로 sort 를 진행한다. reverse=True => Descending
  • rank_dict = [('pop', [(600, 1), (2500, 4)]), ('classic', [(500, 0), (150, 2), (800, 3)])]. pop 의 plays 합이 더 높은걸 알수있다.

이번 코딩문제에서 가장 중요한건 sorted 의 key를 어떤식으로 활용하나 이다.

이제 두번째 for loop 설명:

  • rank_dict 는 list 이다. 거기에 첫번째 아이템은 = ('pop', [(600,1), (2500,4)] ) 임.
  • 각 아이템마다 1번째 아이템인 [(600,1), (2500,4)] 을 가지고 sort 해준다.
  • 아까와 비슷하다. 이번엔 tuple 의 0번째 아이템으로 sort 를 한다. [(2500,4), (600,1)] 이렇게됨.
  • 각 장르당 2개씩밖에 앨범에 안실리기때문에 [:2] 를 끝에 추가해준다.
  • 각 장르당 만들어진 list 를 가지고 순서대로 tuple 의 1번째인 i 값을 넣어주면 끝.
def solution(genres, plays):
    final_lst = []
    table = {}
    
    for i, (g, p) in enumerate(zip(genres, plays)):
    
        if g in table:
            table[g].append((p, i))
        else:
            table[g] = [(p, i)]
    rank_dict= sorted(table.items(), key=lambda tup:sum([x[0] for x in tup[1]]), reverse=True)
    
    for item in rank_dict:
        d = sorted(item[1], key=lambda e:e[0], reverse=True)[:2]
        for _ in d:
            final_lst.append(_[1])
            
    return final_lst
  • 장르안에서 같은 play값을 가지고 있을때 i(고유번호) 가 낮은걸 먼저 줘야하는데 나는 그거 없이 했지만 통과...
  • 다른 사람들은 sorted(key 값에 itemgetter 를 많이 사용한거 같다.) 나는 최대한 import 없이 하고 싶어서 lambda 를 사용 + 이해하기 더 좋은거 같음.
  • 이번에는 sorted 를 이해만 한다면 쉽게 풀수 있는것 같다.
  • 이제 hash는 혼자서도 잘 푸는듯ㅎㅎ 하하하하하하 호호호호호

rank_dict 만들때 table 이름을 잘못써서 한참을 코드를 뜯어고치다가 이름이 잘못된걸 알아차리고 돌려보니 성공. 다들 저런 실수 조심하세요.