문제출처: https://programmers.co.kr/learn/courses/30/lessons/42579
입력 값(장르)
["classic", "pop", "classic", "classic", "pop"]
입력 값(장르별 재생횟수)
[500, 600, 150, 800, 2500]
출력값
[4, 1, 3, 0]
위 입력값을 정리해보면
classic = 500, 150, 800 (sum = 1450)
pop = 2500, 600 (sum = 3100)
이렇게 총 재생 횟수가 제일 많은 장르의 노래 중 재생횟수가 제일 많은 것 두개 씩 순서 대로 '입력 값(장르별 재생횟수)'의 index를 출력(최대 2개씩)
import java.util.*;
class Solution {
public ArrayList<Integer> solution(String[] genres, int[] plays) {
HashMap<String, ArrayList<Integer>> hm = new HashMap<>();
for(int i = 0; i <genres.length; i++) {
if(hm.containsKey(genres[i])) {
hm.get(genres[i]).add(plays[i]);
} else {
ArrayList<Integer> playsByGenre = new ArrayList<>();
playsByGenre.add(plays[i]);
hm.put(genres[i], playsByGenre);
}
}
TreeMap<Integer, String> tm = new TreeMap<>(Collections.reverseOrder());
for(String key : hm.keySet()) {
Collections.sort(hm.get(key));
Collections.reverse(hm.get(key));
int count = 0;
for(int play : hm.get(key))
count += play;
tm.put(count, key);
}
ArrayList<Integer> answer = new ArrayList<Integer>();
for(int key : tm.keySet()) {
int playTemp = hm.get(tm.get(key)).get(0);
String genreTemp = tm.get(key);
boolean [] added = new boolean [plays.length];
for(int i = 0; i < plays.length; i++) {
if(plays[i] == playTemp && genres[i].equals(genreTemp)) {
answer.add(i);
added[i] = true;
break;
}
}
if(hm.get(tm.get(key)).size() > 1) {
int playTemp2 = hm.get(tm.get(key)).get(1);
for(int i = 0; i < plays.length; i++) {
if(plays[i] == playTemp2 && genres[i].equals(genreTemp) && !added[i]) {
answer.add(i);
}
}
}
}
return answer;
}
}
입력 예시를 이용해서 설명하자면,
HashMap으로
classic ={ 500, 150, 800 }
pop = {600, 2500}
다시 트리맵으로 각 장르의 재생횟수를 키로 (descending으로함)
TreeMap<Integer, String> tm = new TreeMap<>(Collections.reverseOrder());
3100 = pop
1450 = classic
그러면서 동시에 Hashmap을 descending으로 sort
classic ={ 800, 500, 150 }
pop = {2500, 600}
원래 입력값 + HashMap + TreeMap을 이용하여 index를 찾아서 출력
1차 제출 (실패 8개)
디버깅을 해보니 HashMap에 장르별로 재생횟수의 노래가 1개씩만 있을 수 도 있는 경우가 포함이 안됨
수정 후 2차 제출(실패 2개)
질문하기를 확인하니 장르별 총 재생횟수가 같은 경우는 없으나 장르의 노래별 재생횟수는 같은 경우가 있기때문에 그런 경우는 오름차 순으로 출력을 해주어야함. 내 코드의 경우에는 똑같은 index를 두번 씩 출력하고 있었음.
ex) classic = {300, 200,200, 100} 이면 {1, 2} 가 출력이 되어야 하는데 내코드는 {1, 1}을 출력하고 있었음.
수저 후 3차 제출 (통과)
