Sangil's blog

https://github.com/ChoiSangIl Admin

프로그래머스 코딩테스트연습 베스트앨범 자바(JAVA) DEV / ALGORITHM

2020-07-19 posted by sang12


프로그래머스 해시 연습문제 베스트 앨범 해답입니다. 푸는데 엄청 애 먹었네요 ㅜㅜ

문제는, 노래 장르와 노래 재생 횟수가 배열로 주어지는데, 이를 이용해서 베스트 앨범을 만드는 문제입니다.

1. 장르 재생수가 가장 많은 순서로 수록한다.

2. 장르내에서 재생이 가장 많이된 순서로 수록한다.

3. 장르내엣 재생횟수가 같으면 고유번호가 낮은 노래를 먼저 수록한다.

(https://programmers.co.kr/learn/courses/30/lessons/42579)

아래와 같이 장르별로 재생수를 카운팅한 HashMap을만들었고, 고유 id별 재생수(재생수로 정렬) LinkedHashMap과 고유 id의 장르를 가지고 있는 HashMap을 이용하여 문제를 해결했습니다. 

{pop=3100, classic=1450} <-- 장르별 재생수
{4=2500, 3=800, 1=600, 0=500, 2=150} <-- 재생수로 정렬된 고유 ID
{0=classic, 1=pop, 2=classic, 3=classic, 4=pop} <-- 고유 ID별 장르타입

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
	Map<String, Integer> group = new HashMap<String, Integer>();
	for(int i=0; i<genres.length;i++) {
		if(group.containsKey(genres[i])) {
			group.put(genres[i], group.get(genres[i])+plays[i]);
		}else {
			group.put(genres[i], plays[i]);
		}
	}
		
	Map<Integer, Integer> idAndPlaysMap = new HashMap<Integer, Integer>();
	Map<Integer, Integer> idAndPlaysLinkedMap = new LinkedHashMap<Integer, Integer>();
        Map<Integer, String> idAndGenres = new HashMap<Integer, String>();
        ArrayList<Integer> resultList = new ArrayList<Integer>();
        
        for(int i=0; i<genres.length;i++) {
    		idAndPlaysMap.put(i, plays[i]);
    		idAndGenres.put(i, genres[i]);
    	}
        
        List<String> keySetList = new ArrayList<>(group.keySet());
        Collections.sort(keySetList, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return group.get(o2).compareTo(group.get(o1));
            }
        });
        
        List<Integer> keySetList2 = new ArrayList<>(idAndPlaysMap.keySet());
        Collections.sort(keySetList2, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return idAndPlaysMap.get(o2).compareTo(idAndPlaysMap.get(o1));
            }
        });
        
        for(Integer key : keySetList2) {
        	idAndPlaysLinkedMap.put(key, idAndPlaysMap.get(key));
        }
        
        for(String key : keySetList) {
        	Iterator<Integer> keys = idAndPlaysLinkedMap.keySet().iterator();
        	int indexId = 0;
        	while ( keys.hasNext() ) {
        		Integer playKey = keys.next();
        		String genresName = idAndGenres.get(playKey);
                
        		if(key.equals(genresName)) {
                    if(indexId==2) {break;}
        			resultList.add(playKey);
        			indexId++;
        		}
        	}   
        }
        
        int[] answer = new int[resultList.size()];
        
        for(int i = 0; i < resultList.size(); i++){
            answer[i] = resultList.get(i);
        }
        
        return answer; 
    }
}

흐.. 부족함을 많이느끼네요 한 4시간은 본거같은데.. 다른분들의 좋은 소스를 참고해서 더 공부해봐야겠어요 :). 아 참고로, 스트링을 ==로 비교하면 프로그래머스 정답나오는데 약간 오류가있더라구요 그래서 equlas로 변경했답니다.. 한참 삽질을...

REPLY