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();
}
}
반응형