-
[프로그래머스] 해시 - 베스트 앨범알고리즘 공부/문제 풀이 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를 많이 사용하게 되어서..
이번에는 구글링 하지 않고 해결하였다.
'알고리즘 공부 > 문제 풀이' 카테고리의 다른 글
[프로그래머스] 이분 탐색 - 징검다리 (0) 2020.09.01 [프로그래머스] 이분탐색 - 입국심사 (0) 2020.09.01 [프로그래머스] 해시 - 위장 (1) 2020.08.31 [프로그래머스] 해시 - 전화번호 목록 (1) 2020.08.28 [프로그래머스] 해시 - 완주하지 못한 선수 (1) 2020.08.28