문제 분석
- 장르별로 가장 많이 재생된 노래를 2개씩 모아 (최대 2개) 베스트 엘범을 출시하려 함
- 노래는 고유 번호로 구분
- 노래를 수록 하는 기준
- 1. 속한 노래가 많이 재생된 장르 먼저 수록
- 2. 장르 내 많이 재생된 노래 먼저 수록
- 3. 장르 내 재생 횟수가 같은 노래 중 고유 번호가 낮은 노래 먼저 수록
- genres : 노래 장르 문자열
- plays : 노래 별 재생 횟수
- 베스트 엘범에 들어갈 노래의 고유 번호를 순서대로 return
코드 설계
- 장르 선택 : 장르들의 재생횟수 합
- 같은 장르의 노래 재생수 확인
- 많이 들은 것 중 최대 2개 선택
- 장르 : key, 재생 횟수 : value인 dictionary
1차
def solution(genres, plays):
answer = []
set_genres = set(genres)
print(set_genres)
best = {}
for i in range(len(genres)):
if genres[i] in best.keys():
best[genres[i]] += int(plays[i])
else :
best[genres[i]] = int(plays[i])
print(best)
print(best.values())
print(max(best.values())) # 딕셔너리 value 중 최댓값
print([k for k,v in best.items() if v == max(best.values())]) # value가 최댓값인 key
return answer
g = ["classic", "pop", "classic", "classic", "pop"]
p = [500, 600, 150, 800, 2500]
print(solution(g,p))
- 현재 최대 플레이수를 갖는 장르를 찾음
- 해당 장르를 갖는 것만 빼서 새로운 list로 저장
- 아 근데 처음 리스트의 인덱스 값도 가지고 있어야..
- 해당 장르의 베스트를 뽑고 나면 set_genre에서 제거
def solution(genres, plays):
answer = []
set_genres = set(genres)
best = {}
for i in range(len(genres)):
if genres[i] in best.keys():
best[genres[i]] += int(plays[i])
else :
best[genres[i]] = int(plays[i])
print(best)
print(best.values())
print(max(best.values())) # 딕셔너리 value 중 최댓값
print([k for k,v in best.items() if v == max(best.values())]) # value가 최댓값인 key
gg = [k for k,v in best.items() if v == max(best.values())]
same_genre = []
for k, v in best.items() :
if k == gg :
return answer
실패
정답 코드
다른 사람 코드 1
def solution(genres, plays):
answer = []
temp = []
total_genre = {}
temp = [[genres[i], plays[i], i] for i in range(len(genres))] # [장르, 재생횟수, 고유 번호] 리스트
temp = sorted(temp, key=lambda x : (x[0], -x[1], x[2])) # 많이 재생될수록, 같다면 고유번호가 낮을수록
for g in temp : # {장르 : 총 재생횟수} 장르별 재생 횟수 딕셔너리 생성
if g[0] not in total_genre :
total_genre[g[0]] = g[1]
else :
total_genre[g[0]] += g[1]
total_genre = sorted(total_genre.items(), key=lambda x : -x[1]) # 재생횟수가 많은 순서대로 / 내림차순
for i in total_genre : # 같은 장르에서 최대 2곡까지 수록
count = 0
for j in temp :
if i[0] == j[0] : # 같은 장르이면
count += 1
if count > 2 :
break
else :
answer.append(j[2]) # 고유번호 입력
return answer
- [장르, 재생횟수, 인덱스(고유번호)] 형식으로 리스트 저장
- 속한노래가 가장 많이 재생된 장르를 먼저 수록하기 위해 장르를 key로 하는 딕셔너리 생성
- 재생횟수 내림차순, 고유번호 오름차순 정렬
- 최종 생성한 딕셔너리 key 순서대로 정렬한 리스트를 탐색하며 최대 count 2까지의 고유번호를 수록
다른 사람 풀이 2
def solution(genres, plays):
answer = []
dic1 = {}
dic2 = {}
for i, (g, p) in enumerate(zip(genres, plays)):
if g not in dic1:
dic1[g] = [(i, p)]
else:
dic1[g].append((i, p))
if g not in dic2:
dic2[g] = p
else:
dic2[g] += p
for (k, v) in sorted(dic2.items(), key=lambda x:x[1], reverse=True):
for (i, p) in sorted(dic1[k], key=lambda x:x[1], reverse=True)[:2]:
answer.append(i)
return answer
2회차 - 2024.11.28
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[Python] 프로그래머스 lv.0 전국 대회 선발 고사 (0) | 2024.11.27 |
---|---|
[Python] 프로그래머스 lv.2 다리를 지나는 트럭 (0) | 2024.11.27 |
[Python] 프로그래머스 lv.2 의상 (1) | 2024.11.25 |
[Python] 프로그래머스 lv.0 문자열 묶기 (0) | 2024.11.25 |
[Python] 프로그래머스 lv.0 배열의 길이를 2의 거듭제곱으로 만들기 (0) | 2024.11.25 |