プログラマー-ベストアルバム(java)
💿📀 質問する
📃プログラマー-ベストアルバム
💿📀 に答える
問題の条件により,考慮対象の優先度は以下のようになる.
各ジャンルの総再生数→各アルバムの再生数→アルバムの一意番号
タイプ順で1位なので、タイプ名のKey値のMapを使って解決すべきですが、どうやって価値を掴むのか悩んでしまいます.
ジャンル名によっては、総再生数とアルバムの情報(再生数と固有番号)が必要です.
アルバムの固有番号はplays配列のインデックスです.固有番号さえあれば、アルバムの再生数はプレイで知ることができる.
従ってvalueに基づいて必要な情報を総裁ミネラルウォーターと固有番号リストとする.
2人のタイプが違うのでGenreというクラスを作成しました.
Genreクラスには、次のものがあります.
異なるタイプの総裁ミネラルウォーターの総変数を蓄積することができます.
アルバムの固有番号はアルバムリストからなる.
以下のMap構造で問題を解く.
💿📀 ろんり
入力データ
問題の基本的なテストケース.
genres : ["classic", "pop", "classic", "classic", "pop"]
plays : [500, 600, 150, 800, 2500]
1.入力データをMapに入れます。
→データはタイプ別に分けます.
2.総裁ミネラルウォーターでソート
今は体裁名はいらない!
Mapの値をListに変換します.
異なるタイプの総裁ミネラルウォーターに基づいてリストを並べます.
本当はListに変換せず、Map順に並べ替えたいのですが、Map順のコードが少し汚れているので簡単にListに変換して並べ替えます.
3.最後に、ジャンル別にベストアルバムを2枚選択
PriorityQueue(PriorityQueue)で
ユニークな数字と再生数を入力します.
ベストアルバムを2枚か1枚選べば、答えが出ます.
回答!
💿📀 コード#コード#
public List<Integer> solution(String[] genres, int[] plays) {
List<Integer> answer = new ArrayList<Integer>();
Map<String, Genre> gMap = new HashMap<>();
/* 1. map에 장르별로 데이터 추가 */
for(int i=0; i< genres.length ; i++) {
if(gMap.containsKey(genres[i])) {
Genre oriGen = gMap.get(genres[i]);
oriGen.addGenre(plays[i], i);
gMap.put(genres[i], oriGen);
}
else {
gMap.put(genres[i], new Genre(plays[i], i));
}
}
/* 2. 장르별 정렬 */
List<Genre> gList = new ArrayList<>(gMap.values());
//총재생수를 이용하여 비교
gList.sort((o1, o2)-> o2.getTotal() - o1.getTotal());
/* 3. 장르별 베스트앨범 2개 선정 */
for (Genre list : gList) {
/* PriorityQueue
* 재생수 큰 순서대로 정렬
* 같을 경우 앨범고유번호 순으로 */
PriorityQueue<int[]> q = new PriorityQueue<>((o1,o2) -> {
if(o2[1] - o1[1] == 0)
return o1[0] - o2[0];
else
return o2[1] - o1[1];
});
// 큐에 모든 앨범 추가
for(int i : list.getAlbumList()) {
int[] play = {i,plays[i]};
q.offer(play);
}
// 상위 두개만 꺼낸다.
answer.add(q.poll()[0]);
if(!q.isEmpty())
answer.add(q.poll()[0]);
}
return answer;
}
class Genre{
int total = 0; //총 재생 수
List<Integer> albumList = new ArrayList<>(); //앨범 고유번호 리스트
/**
* 앨범 추가
* - 재생수 누적, 앨범리스트 추가
*/
public void addGenre(int total, int album) {
this.total += total;
this.albumList.add(album);
}
public Genre(int total, int album) {
this.total += total;
this.albumList.add(album);
}
// Getter, Setter 생략 //
}
💿📀 の最後の部分
最初はMapで解くのは分かってたけど救助を掴むのに迷ってた
MapもListもQueueもたくさん書いてあります
もっと簡単にできるようです.また今度解いてみよう~
Reference
この問題について(プログラマー-ベストアルバム(java)), 我々は、より多くの情報をここで見つけました https://velog.io/@co_ol/프로그래머스-베스트앨범javaテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol