[문제 - 베스트앨범]
[코딩테스트 연습 > 해시 > 베스트앨범]
https://school.programmers.co.kr/learn/courses/30/lessons/42579
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[접근 방식]
'해시' 파트인 만큼, HashMap을 사용하여 해결하려한다.
1.장르별 모든 음악 재생 수를 기준으로 장르를 정렬한다.
[classic : 1450 , pop : 3100] 이므로, [pop , classic] 순으로 정렬해야 한다.
2. 장르별로 음악을 분류한다.
3. '1.' 에서 정렬한 장르 순서대로 해당 장르에서 상위 2개의 음악을 resultList 에 저장한다.
[pop = [4, 1] , classic = [3, 0]]
resultList = {4, 1, 3, 0}
4. List -> Array 변환
[Java 코드]
//https://school.programmers.co.kr/learn/courses/30/lessons/42579
//코딩테스트 연습 > 해시 > 베스트앨범
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
Map<String, Integer> genrePlayCount = new HashMap<>(); //장르 전체 재생수 저장
Map<String, Map<Integer, Integer>> genreMap = new HashMap<>(); //장르별 음악 분류
for (int i = 0; i < genres.length; i++) {
Map<Integer, Integer> map = genreMap.getOrDefault(genres[i], new HashMap<>());
map.put(i, plays[i]);
genreMap.put(genres[i], map);
// 장르별 총 재생수를 계산
genrePlayCount.put(genres[i], genrePlayCount.getOrDefault(genres[i], 0) + plays[i]);
}
// 장르 총 재생수 기준으로 정렬 (내림차순)
List<String> genreOrder = new ArrayList<>(genrePlayCount.keySet());
genreOrder.sort((g1, g2) -> genrePlayCount.get(g2) - genrePlayCount.get(g1));
//베스트 앨범에 포함될 인덱스 수집
List<Integer> resuList = new ArrayList<>();
for (String genre : genreOrder) {
Map<Integer, Integer> sortedMap = genreMap.get(genre);
List<Map.Entry<Integer, Integer>> sortedList = new ArrayList<>(sortedMap.entrySet());
//재생수 기준 내림차순 정렬
sortedList.sort((a, b) -> b.getValue().compareTo(a.getValue()));
//장르별 상위 2곡 추가
for (int i = 0; i < Math.min(sortedList.size(), 2); i++) {
resuList.add(sortedList.get(i).getKey());
}
}
//List -> Array
int[] answer = new int[resuList.size()];
for (int i = 0; i < answer.length; i++) {
answer[i] = resuList.get(i);
}
return answer;
}
}
[Rewind]
1. 어려웠던 점
1) HashMap 을 value 값 기준으로 정렬하기
2. 알게된 점
1) HashMap 을 value 값 기준으로 정렬하기
//1. HashMap 생성
Map<Integer, Integer> map = new HashMap<>();
//2. Entry List 로 변환
List<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
//3. value 기준 내림차순 정렬 (람다식 이용)
list.sort((a, b) -> b.getValue().compareTo(a.getValue()));
//4. 정렬된 list 를 통해 정렬된 map 생성
Map<Integer, Integer> sortedMap = new LinkedHashMap<>();
for (Map.Entry<Integer, Integer> entry : list) {
sortedMap.put(entry.getKey(), entry.getValue());
}
3. 개선방안
'프로그래머스' 카테고리의 다른 글
[programmers] 미로 탈출 명령어 (JAVA) (0) | 2024.12.01 |
---|---|
[programmers - 2020 카카오 인턴십] 수식 최대화 (Java) (0) | 2024.09.15 |
[programmers - 2020 카카오 인턴십] 경주로 건설 (Java) (1) | 2024.09.15 |