import java.util.*;
class Solution {
public static int[] solution(String[] genres, int[] plays) {
List<Integer> resultList = new ArrayList<>();
Map<String, List<Music>> playListMap = new HashMap<>();
Map<String, Integer> playCountMap = new HashMap<>();
for (int i = 0; i < genres.length; i++) {
Music music = new Music().setIdx(i)
.setPlay(plays[i]);
if (playListMap.containsKey(genres[i])){
playListMap.get(genres[i])
.add(music);
playCountMap.put(genres[i], playCountMap.get(genres[i]) + plays[i]);
} else {
playListMap.put(genres[i], new ArrayList<Music>(){{
add(music);
}});
playCountMap.put(genres[i], plays[i]);
}
}
List<String> keySetList = new ArrayList(playCountMap.keySet());
// 오름차순
keySetList.sort((o1, o2) -> playCountMap.get(o2) - playCountMap.get(o1));
for ( String key : keySetList){
List<Music> musics = playListMap.get(key);
Collections.sort(musics);
int i = 0;
for( Music music : musics){
if( i++ > 1 ) break;
resultList.add(music.getIdx());
}
}
int[] result = new int[resultList.size()];
int i = 0;
for (Integer integer : resultList) {
result[i++] = integer;
}
return result;
}
public static class Music implements Comparable<Music>{
private int play;
private int idx;
public int getPlay() {
return play;
}
public Music setPlay(int play) {
this.play = play;
return this;
}
public int getIdx() {
return idx;
}
public Music setIdx(int idx) {
this.idx = idx;
return this;
}
@Override
public int compareTo(Music o) {
int result = o.getPlay() - this.getPlay();
return result == 0 ? (this.getIdx() - o.getIdx()) : result;
}
@Override
public String toString() {
return "Music{" +
"play=" + play +
", idx=" + idx +
'}';
}
}
}
정렬을 위한 Music 내부 Class와 Comparable를 구현해 쉽게 풀어냈다
정확성 테스트
정확성 테스트
테스트 1 〉 통과 (1.49ms, 52.5MB)
테스트 2 〉 통과 (2.80ms, 52.7MB)
테스트 3 〉 통과 (3.66ms, 53.4MB)
테스트 4 〉 통과 (3.03ms, 53.3MB)
테스트 5 〉 통과 (1.63ms, 52.3MB)
테스트 6 〉 통과 (1.71ms, 52.1MB)
테스트 7 〉 통과 (1.71ms, 53.1MB)
테스트 8 〉 통과 (1.49ms, 51.7MB)
테스트 9 〉 통과 (1.53ms, 53.7MB)
테스트 10 〉 통과 (1.65ms, 52.6MB)
테스트 11 〉 통과 (2.37ms, 52MB)
테스트 12 〉 통과 (1.71ms, 52.6MB)
테스트 13 〉 통과 (1.67ms, 52.3MB)
테스트 14 〉 통과 (1.76ms, 52.7MB)
테스트 15 〉 통과 (6.27ms, 54.2MB)
import java.util.HashMap;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Collections;
class Solution {
public int[] solution(String[] genres, int[] plays) {
HashMap<String, Object> genresMap = new HashMap<String, Object>(); //<장르, 곡 정보>
HashMap<String, Integer> playMap = new HashMap<String, Integer>(); //<장르, 총 장르 재생수>
ArrayList<Integer> resultAL = new ArrayList<Integer>();
for(int i = 0; i < genres.length; i++){
String key = genres[i];
HashMap<Integer, Integer> infoMap; // 곡 정보 : <곡 고유번호, 재생횟수>
if(genresMap.containsKey(key)){
infoMap = (HashMap<Integer, Integer>)genresMap.get(key);
}
else {
infoMap = new HashMap<Integer, Integer>();
}
infoMap.put(i, plays[i]);
genresMap.put(key, infoMap);
//재생수
if(playMap.containsKey(key)){
playMap.put(key, playMap.get(key) + plays[i]);
}
else {
playMap.put(key, plays[i]);
}
}
int mCnt = 0;
Iterator it = sortByValue(playMap).iterator();
while(it.hasNext()){
String key = (String)it.next();
Iterator indexIt = sortByValue((HashMap<Integer, Integer>)genresMap.get(key)).iterator();
int playsCnt = 0;
while(indexIt.hasNext()){
resultAL.add((int)indexIt.next());
mCnt++;
playsCnt++;
if(playsCnt > 1) break;
}
}
int[] answer = new int[resultAL.size()];
for(int i = 0; i < resultAL.size(); i++){
answer[i] = resultAL.get(i).intValue();
}
return answer;
}
private ArrayList sortByValue(final Map map){
ArrayList<Object> keyList = new ArrayList();
keyList.addAll(map.keySet());
Collections.sort(keyList, new Comparator(){
public int compare(Object o1, Object o2){
Object v1 = map.get(o1);
Object v2 = map.get(o2);
return ((Comparable) v2).compareTo(v1);
}
});
return keyList;
}
}
다른 인원이 제출한 코드이나, 내부 Class가 아닌 JCF통해 풀어냈다
정확성 테스트
테스트 1 〉 통과 (0.51ms, 51.9MB)
테스트 2 〉 통과 (0.57ms, 52.2MB)
테스트 3 〉 통과 (0.50ms, 53.9MB)
테스트 4 〉 통과 (0.48ms, 52.7MB)
테스트 5 〉 통과 (0.91ms, 52.8MB)
테스트 6 〉 통과 (0.84ms, 52MB)
테스트 7 〉 통과 (0.78ms, 51.9MB)
테스트 8 〉 통과 (0.63ms, 52.7MB)
테스트 9 〉 통과 (0.53ms, 52.1MB)
테스트 10 〉 통과 (1.53ms, 52.5MB)
테스트 11 〉 통과 (0.55ms, 52.1MB)
테스트 12 〉 통과 (0.70ms, 52.2MB)
테스트 13 〉 통과 (0.80ms, 52.4MB)
테스트 14 〉 통과 (0.97ms, 52.7MB)
테스트 15 〉 통과 (0.63ms, 52.1MB)
JCF와 Iterator를 사용해서 그런지 속도가 장난아니게 빠르다,, 가시성을 위해 inner Class를 사용했지만 효율성을 고려해 JCF만 사용해는 것을 고려해봐야겠다
def solution(genres, plays):
answer = []
dic = {}
album_list = []
for i in range(len(genres)):
dic[genres[i]] = dic.get(genres[i], 0) + plays[i]
album_list.append(album(genres[i], plays[i], i))
dic = sorted(dic.items(), key=lambda dic:dic[1], reverse=True)
album_list = sorted(album_list, reverse=True)
while len(dic) > 0:
play_genre = dic.pop(0)
print(play_genre)
cnt = 0;
for ab in album_list:
if play_genre[0] == ab.genre:
answer.append(ab.track)
cnt += 1
if cnt == 2:
break
return answer
class album:
def __init__(self, genre, play, track):
self.genre = genre
self.play = play
self.track = track
def __lt__(self, other):
return self.play < other.play
def __le__(self, other):
return self.play <= other.play
def __gt__(self, other):
return self.play > other.play
def __ge__(self, other):
return self.play >= other.play
def __eq__(self, other):
return self.play == other.play
def __ne__(self, other):
return self.play != other.play
내부 클래스를 사용해 풀어냈다
정확성 테스트
정확성 테스트
테스트 1 〉 통과 (0.03ms, 10.4MB)
테스트 2 〉 통과 (0.03ms, 10.3MB)
테스트 3 〉 통과 (0.02ms, 10.3MB)
테스트 4 〉 통과 (0.02ms, 10.3MB)
테스트 5 〉 통과 (0.21ms, 10.3MB)
테스트 6 〉 통과 (0.18ms, 10.3MB)
테스트 7 〉 통과 (0.11ms, 10.3MB)
테스트 8 〉 통과 (0.07ms, 10.3MB)
테스트 9 〉 통과 (0.03ms, 10.3MB)
테스트 10 〉 통과 (0.22ms, 10.2MB)
테스트 11 〉 통과 (0.04ms, 10.3MB)
테스트 12 〉 통과 (0.11ms, 10.3MB)
테스트 13 〉 통과 (0.19ms, 10.3MB)
테스트 14 〉 통과 (0.22ms, 10.3MB)
테스트 15 〉 통과 (0.03ms, 10.3MB)
부끄럽게도 아직 python에 대한 문법 지식이 부족해 답변을 참고하였다. 자바 제출 코드와 비슷한 유형이지만 python 문법과의 차이를 다시 다져보는 시간. :)