ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 해시 - 베스트 앨범
    알고리즘 공부/문제 풀이 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를 많이 사용하게 되어서..

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

    댓글

Designed by Tistory.