プログラマー-ベストアルバム(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もたくさん書いてあります
もっと簡単にできるようです.また今度解いてみよう~