java 프로그래머스 [해쉬] _베스트앨범

2021. 4. 29. 22:18프로그래머스 알고리즘/코딩 테스트 고득점 Kit

반응형

 

출제 링크 : programmers.co.kr/learn/courses/30/lessons/42579

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가

programmers.co.kr

 


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;

class Solution {
	public int[] solution(String[] genres, int[] plays) {
		// 장르별 재생횟수를 구하기 위해 hashmap사용
		HashMap<String, Integer> hm = new HashMap<String, Integer>(); 
        
        // hashmap에 장르별 플레이 횟수 저장
		for (int i = 0; i < genres.length; i++) { 
			hm.put(genres[i], hm.getOrDefault(genres[i], 0) + plays[i]);
		}
		
        // 나중에 int[]형으로 바꿔서 리턴할 arrayList
		ArrayList<Integer> answers = new ArrayList<Integer>();
        
        // Value를 내림차순으로 정리하기 위해 정의
		ArrayList<String> al = new ArrayList<String>(hm.keySet()); 
        
        // ArrayList를 hm Value 내림차순 순으로 정렬
		Collections.sort(al, (o1, o2) -> (hm.get(o2).compareTo(hm.get(o1)))); 

		// 비교, 정답 추출 실행문
		for (int i = 0; i < al.size(); i++) { 
			String TempGenres = al.get(i);
			int firstIdx = 0;
			int secondIdx = 0;
			int max = 0;
			for (int j = 0; j < genres.length; j++) { 
            	// 높은 순으로 가져온 장르와 genres배열의 값이 같으면
				if (TempGenres.equals(genres[j])) { 
                	// max와 비교해서 최댓값 갱신
					if (plays[j] > max) { 
						max = plays[j];
						firstIdx = j;
					}
				}
			}

			max = -1; // 장르가 하나일 수 있으므로 -1
			for (int j = 0; j < genres.length; j++) { // 두번째 값 구하기
				if (TempGenres.equals(genres[j])) {
					if (j != firstIdx && plays[j] > max) {
						max = plays[j];
						secondIdx = j;
					}
				}
			}
			answers.add(firstIdx); // 제일 큰 값 추가
			if (max != -1) {
				answers.add(secondIdx); // 다음 큰 값 추가
			}
		}

		return answers.stream().mapToInt(Integer::intValue).toArray();

	}
}

 

 

 

반응형