programmers.co.kr/learn/courses/30/lessons/42579
코딩테스트 연습 - 베스트앨범
스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가
programmers.co.kr
level3 해시
1.
def solution(genres, plays):
answer = []
result = {}
for x, y in zip(genres,plays):
result[x] = result.get(x,[])
result[x].append(y)
result = sorted(result.items(),key= lambda x: sum(x[1]),reverse=True)
for i in range(len(result)):
result[i][1].sort()
result[i][1].reverse()
dic = {key:value for key, value in zip(plays, range(len(plays)))}
print(result, dic)
for i in result:
for j in range(2):
if dic[i[1][j]] in answer:
num = plays.count(i[1][j]) -1
index = answer.index(dic[i[1][j]])
answer[index] = answer[index] - num
answer.append(answer[index] + 1)
else:
answer.append(dic[i[1][j]])
if len(i[1]) == 1:
break
return answer
dic 부분을 괜히 딕셔너리로 만들어서 한참 고생했다 ㄱ-... 딕셔너리는 중복 허용 불가한데 문제에선 중복되는 수가 있을 수 도 있으므로 딕셔너리를 쓰면 마지막 고유번호만 들어가서 안됨.
2.
def solution(genres, plays):
answer = []
result = {}
for x, y in zip(genres,plays):
result[x] = result.get(x,[])
result[x].append(y)
result = sorted(result.items(),key= lambda x: sum(x[1]),reverse=True)
for i in range(len(result)):
result[i][1].sort()
result[i][1].reverse()
dic = [[key,value] for key, value in zip(plays, range(len(plays)))]
print(result, dic)
for i in result:
for j in range(2):
for x in dic:
if x[0] == i[1][j]:
answer.append(x[1])
dic.remove(x)
break
if len(i[1]) == 1:
break
return answer
그래서 딕셔너리 부분을 리스트로 고치고 result와 dic을 비교해주는 방법으로 풀었다. 하지만 이러면 시간이 너무 많이들어 시간초과까지 아슬아슬하다... 더 좋은 방법을 생각하는게 좋을듯.
'2 > 프로그래머스' 카테고리의 다른 글
프로그래머스 연습 문제 - JadenCase 문자열 만들기 (0) | 2020.10.30 |
---|---|
프로그래머스 연습 문제 - 가장 큰 정사각형 찾기 (0) | 2020.10.29 |
프로그래머스 연습 문제 - 짝지어 제거하기 (0) | 2020.10.27 |
프로그래머스 연습 문제 - 같은 숫자는 싫어 (0) | 2020.10.26 |
프로그래머스 연습 문제 - 예상 대진표 (0) | 2020.10.25 |