자료구조 생성과 이차원 배열의 정렬

서재환·2021년 11월 9일
0

CT

목록 보기
8/8

😵 이렇게 자료구조를 만들어야 할 때도 있구나

알고리즘 문제를 푸는데 이렇게 자료구조를 만들어야 할 때도 있구나 문제를 만나게 되었다.

문제소개

genres = ["hiphop", "classic", "pop", "classic", "classic", "pop", "hiphop"]
played_songs = [2000, 500, 600, 150, 800, 2500, 2000]

하나의 노래가 있다고 하고 그 노래는 genres라는 배열과 played_songs라는 각각의 배열에서
다음과 같은 의미를 갖는다고 생각해보자. genres에선 그 노래가 속한 장르를, played_songs
에선 그 노래가 플레이된 횟수의 의미를 가진다.

그니까 인덱스가 0번인 노래는 힙합 장르이고 2000번 재생된 곡인 것이다.

해당 문제에선 각각의 노래를 인기가 많은 장르 순으로 그리고 플레이 횟수가 많은 순으로 정렬
되기를 원했다. 그러니까 정렬을 원하는데 2가지 조건을 요구했다. 

그러니까 내 iphone에 있는 수록곡을 현재 가장 핫한 장르순으로 정렬하길 원하는 것이다. 현
재 vevo 차트에서 hiphop이 1이고 R&B가 2순위 라면 hiphop 이 플레이 1순위가 될 것이고 
마지막 힙합 노래 다음 R&B 노래가 나온다는 것이다. 그 와중에 hiphop 노래를 재생횟수가 많은
순서대로 정렬해서 iphone 유저에게 나타내주고 싶은 것이다.

시리야 현재 인기가 높은 장르 순으로 노래를 나열해줘 그리고 그 노래를 사람들이 많이 재생한
순으로 나열해줘

정렬의 기준이 되는 장르, 재생횟수

해당 문제가 어려운 것은 정렬을 해야하는 기준이 많아서이다. 우선 인기장르가 뭔지 알아야 한다.
그리고 나서 인기 장르별 아이폰 내 수록곡을 재생횟수가 많은 순으로 정렬해야 하고 반환 값은 맨
처음 정렬하기 이전 아이폰 내 저장되어 있는 노래 순서를(index)를 기억해서 index자체가 노래
를 나타내는 표시로 배열에 담겨 반환되어야 한다.

새로운 자료구조를 만들어줘 그러면 너가 원하는대로 정렬할 수 있을거야

그래서 딕셔너리를 활용해서 genres와 played_songs를 활용해 하나의 key로 해당 장르가 총 몇번
재생되었는지 {"key"=value} 형태로 만들 수 있어야 한다.

여기까지는 할 만하다. 문제는 어떻게 장르별 수록곡을 재생횟수가 많은 순서대로 처음 아이폰에 저장
된 순서를 담은 데이터셋을 만들어내는 부분이다.

먼저 {"key":value} 형태를 {"key":[[], ... []]} 형태로 만들 수 있어야 한다. 파이썬의 sorted()
함수가 있기에 위와 같은 자료구조 형태를 떠올릴 수 있는 것이다. 예시를 들어 보자

아이폰에 힙합 노래는 2곡이 있고 순서는 처음(0)과 끝(6)에 위치해 있다. 그래서 hiphop 만으로 위 자료
구조 형태로 만들면 다음과 같이 {"hiphop": [[0,2000],[6,2000]]} 만들 수 있다. 그러면 hiphop 이
갖고 있는 value 부분만을 get해서 sorted(array, key=lambda x:x[1], reverse=True)를 적용시킬 
수 있다. 적용시키면 힙합장르에 속한 노래(폰에 수록된 순서와 플레이 횟수를 정보를 가진)는 노래는 플레
이 횟수가 많은 순으로 정렬되면서 순서라는 정보를 갖고 있으므로 정답을 제공할 수 있는 형태로 가공 될
수 있는 것이다.

✔️ 해결

시청각 자료가 없이 글로만 쓰니까 딱히 누군가에게 도움이 될 것 같다는 생각은 들지는 않지만 이런 글이 쌓여서 좀 더 나은 글을 쓰길 희망하며 마무리해야겠다.

0개의 댓글