문제
https://school.programmers.co.kr/learn/courses/30/lessons/42579
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
해시맵과 리스트 배열을 사용하여 문제를 풀었다.
해시맵에는 장르에 대한 총 재생수를 넣어주었다.
그리고 리스트 배열을 만들어서 음악 고유 넘버와 재생 수를 저장할 리스트를 만들어 주었다.
총 재생수에 대해 정렬 후 리스트 배열에서 다시 정렬해주었다
코드
import java.util.*;
class Solution {
public ArrayList<Integer> solution(String[] genres, int[] plays) {
//해시
HashMap<String, Integer> hash = new HashMap<>();
//음악 고유 넘버와 재생 수 저장할 리스트
ArrayList<Music> arr [] = new ArrayList [100];
for(int i=0;i<100;i++){
arr[i] = new ArrayList<>();
}
//장르의 인덱스를 알기 위한 리스트
ArrayList<String> index = new ArrayList<>();
//해시에 장르 넣기
for(int i=0;i<genres.length;i++){
int value = 0;
if(hash.containsKey(genres[i])){
value = hash.get(genres[i]);
}
else{
index.add(genres[i]);
}
int idx = index.indexOf(genres[i]);
arr[idx].add(new Music(i, plays[i]));
hash.put(genres[i], value + plays[i]);
}
//총 재생수에 대해 정렬
List<String> list = new ArrayList<>(hash.keySet());
Collections.sort(list, (o1, o2) -> hash.get(o2)-hash.get(o1));
ArrayList<Integer> answer = new ArrayList<>();
//장르에 대해 정렬 후 answer에 노래 넣기
for(String key : list){
int idx = index.indexOf(key);
Collections.sort(arr[idx]);
for(int i = 0; i<2;i++){
answer.add(arr[idx].get(i).realNum);
if(arr[idx].size() == 1) break;
}
}
return answer;
}
public class Music implements Comparable<Music>{
int realNum;
int plays;
public Music(int realNum, int plays){
this.realNum = realNum;
this.plays = plays;
}
public int compareTo(Music o1){
if(this.plays == o1.plays){
return this.realNum - o1.realNum;
}
return o1.plays-this.plays;
}
}
}
다른 분이 푼 코드 중 괜찮은 코드가 있어서 첨부해본다.
import java.util.*;
class Solution {
static class info{
int sum;
int plays;
String genres;
int index;
public info(int sum, int plays, String genres, int index){
this.sum = sum;
this.plays = plays;
this.genres = genres;
this.index = index;
}
}
public int[] solution(String[] genres, int[] plays) {
// 노래 정보 담은 배열
info[] arr = new info[genres.length];
// 장르별 총 재생 수 담은 맵
HashMap<String,Integer> map = new HashMap<>();
// 장르별 총 재생 수 계산
for(int i=0;i<genres.length;i++){
if(map.containsKey(genres[i])){
Integer tmp = map.get(genres[i]);
map.put(genres[i],tmp+plays[i]);
}else{
map.put(genres[i],plays[i]);
}
}
// arr 배열에 노래 정보들 저장
for(int i=0;i<genres.length;i++){
info tmp = new info(map.get(genres[i]),plays[i],genres[i],i);
arr[i] = tmp;
}
// 장르별 총 재생 수 순으로 먼저 나열
Arrays.sort(arr, (o1,o2)->{return o2.sum - o1.sum;});
// 장르가 같은 경우, 장르 내에서 많이 재생된 노래 순으로 정렬. 재생된 노래도 같다면 고유번호가 낮은 순서 대로 정렬
Arrays.sort(arr, (o1,o2)->{if(o1.sum==o2.sum && o1.plays == o2.plays) return o1.index - o2.index;
else if(o1.sum==o2.sum && o1.plays != o2.plays) return o2.plays - o1.plays;
else return o2.sum - o1.sum;});
LinkedList<Integer> list = new LinkedList<>();
int cnt = 0;
String s = "";
// 한 장르에서 최대 2곡까지 저장
for(int i=0;i<arr.length;i++){
info tmp = arr[i];
if(s.equals(arr[i].genres)){
if(cnt<2){
list.add(tmp.index);
cnt++;
}else{
cnt++;
}
}else{
s = tmp.genres;
list.add(tmp.index);
cnt = 1;
}
}
int[] answer = new int[list.size()];
for(int i=0;i<list.size();i++){
answer[i] = list.get(i);
}
return answer;
}
}