IT/알고리즘 문제

프로그래머스 - 베스트앨범

금마s 2021. 9. 16. 23:47

# JAVA

import java.util.HashMap;
import java.util.ArrayList;
import java.util.Collections;

class Music {
	String genre;
	int play;
	int idx;

	public Music(String genre, int play, int idx) {
        this.genre = genre;
		this.play = play;
		this.idx = idx;
	}
}

class Solution {
    public int[] solution(String[] genres, int[] plays) {
    	// 노래를 수록하는 기준
        // 1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
        // 2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
        // 3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
		HashMap<String, Integer> map = new HashMap<String, Integer>();
		for (int i = 0; i < genres.length; i++) {
			map.put(genres[i], map.getOrDefault(genres[i], 0) + plays[i]);
		}

		// 1. 속한 노래가 많이 재생된 장르 먼저 수록 : 장르 선택
		ArrayList<String> genreArr = new ArrayList<String>();
		while (map.size() != 0) {
			int max = 0;
			String genreStr = "";
			for (HashMap.Entry<String, Integer> entry : map.entrySet()) {
				if (max < entry.getValue()) {
					max = entry.getValue();
					genreStr = entry.getKey();
				}
			}
			genreArr.add(genreStr);
			map.remove(genreStr);
		}

		// 2. 장르내에서 많이 재생된 노래를 먼저 수록 : 장르별 노래 genreArr 순서대로 넣는다.
		// 3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록
		ArrayList<Music> playsArr = new ArrayList<Music>();
		for (String str : genreArr) {
			ArrayList<Music> tmpArr = new ArrayList<Music>();
			for (int i = 0; i < genres.length; i++) {
				if (str.equals(genres[i])) {
					tmpArr.add(new Music(str, plays[i], i));
				}
			}
			Collections.sort(tmpArr, (o1, o2) -> o2.play - o1.play);
			playsArr.add(tmpArr.get(0));
			if (tmpArr.size() != 1) {
				playsArr.add(tmpArr.get(1));
			}
		}
		int[] result = new int[playsArr.size()];
		for (int i = 0; i < playsArr.size(); i++) {
			result[i] = playsArr.get(i).idx;
		}
		return result;
    }
}
728x90