알고리즘 공부/문제 풀이

[프로그래머스] 해시 - 베스트 앨범

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를 많이 사용하게 되어서..

이번에는 구글링 하지 않고 해결하였다.