알고리즘 공부/문제 풀이
[프로그래머스] 해시 - 베스트 앨범
valid_ming
2020. 9. 1. 00:45

풀이 방법
1.
map : 장르 key로 int[] value에 접근하는 해시맵
이때 int[0]은 조건 1을 비교하기 위한 total 재생 횟수를 담고
int[1],int[2]는 조건 2를 위한 고유번호를 담는다.
*장르당 2개까지 노래를 담을 수 있기 때문에 int 배열의 크기는 3
numMap : 고유번호 key로 재생 횟수에 접근하는 해시맵
2.
매 반복문마다 total값과 가장 많이 재생된 고유번호를 갱신하며 map을 초기화
3. map의 value를 이차원 배열로 저장하여 int[0]값으로 내림차순 정렬
4. 장르의 노래가 한 곡일 때와 두 곡일 때를 구분하여 list에 저장
5. ArrayList인 list를 int 배열로 바꾸어 answer로.
static int[] solution(String[] genres, int[] plays) {
ArrayList<Integer> list=new ArrayList<Integer>();
HashMap<String,int[]> map=new HashMap<>();
HashMap<Integer,Integer> numMap=new HashMap<>(); //고유번호 해시
//map 초기화
for(int i=0;i<genres.length;i++) {
numMap.put(i, plays[i]);
if(map.containsKey(genres[i])) {
int[] genre_info=map.get(genres[i]);
genre_info[0] += plays[i]; //total값 갱신
//고유번호 갱신
if(plays[i]>numMap.get(genre_info[1])) {
int temp=genre_info[1];
genre_info[1]=i;
genre_info[2]=temp;
}
else if(genre_info[2] == -1 || plays[i]>numMap.get(genre_info[2])) genre_info[2]=i;
map.replace(genres[i], genre_info);
}
else {
int[] info= {plays[i],i,-1}; // total, 첫번째 고유번호, 두번째 고유번호
map.put(genres[i], info);
}
}
//values를 2차원 배열로 변경
int[][] values=new int[map.size()][3];
int index=0;
Set<String> keys=map.keySet();
Iterator<String> it=keys.iterator();
while(it.hasNext()) {
values[index++]=map.get(it.next());
}
//total 값 기준 내림차순
Arrays.sort(values, new Comparator<int[]>() {
public int compare(int[] arr1,int[] arr2) {
return arr2[0]-arr1[0];
}
});
for(int i=0;i<values.length;i++) {
//장르의 곡이 하나인 경우
if(values[i][2]==-1) list.add(values[i][1]);
else {
list.add(values[i][1]);
list.add(values[i][2]);
}
}
int[] answer= new int[list.size()];
for(int i=0;i<answer.length;i++) {
answer[i]=list.get(i);
}
return answer;
}
프로그래머스 문제 풀면서 생각보다 comparator를 많이 사용하게 되어서..
이번에는 구글링 하지 않고 해결하였다.