베스트앨범 - 프로그래머스 해시 Lv3 Java코딩테스트/프로그래머스2023. 1. 18. 14:54
Table of Contents
728x90
728x90
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/42579
풀이
1. getOrDefault
Map의 getOrDefault 를 사용하여 문제의 최우선 조건인 속한 노래가 많이 재생된 장르가 우선시되는 것을 만족시켰다.
getOrDefault(Object key, V DefaultValue)
찾는 key가 존재하면 해당 key에 매핑되어있는 값을 반환하고, 그렇지 않으면 디폴트 값이 반환된다.
map.getOrDefault(genres[i], 0)+plays[i])
Map의 Key값이 중복이 되지 않는 특성을 이용해, 같은 장르일 때 재생된 시간을 더해주었다.
2. compareTo
compareTo를 이용하여 map의 value별 내림차순 정렬을 통한 key값만 따로 컬렉션에 저장했다.
컬렉션에 저장된 Key의 값은 출력 될 장르의 순서가 될 것이다.
Collections.sort(mapKey, (o1, o2) -> (map.get(o2).compareTo(map.get(o1))));
3. 기타사항
이미 장르 순서는 정해져 있으니, 조건을 통해 장르별로 두 개씩 높은 순으로 뽑아낸 다음, 많이 재생된 노래의 index순서만 담아낸다면 문제는 해결된다.
class Solution {
public int[] solution(String[] genres, int[] plays) {
int length = plays.length;
//1. 속한 노래가 많이 재생된 장르 먼저 수록 -> map에 장르Key, 재생횟수Value
HashMap<String, Integer> map = new HashMap<String, Integer>();
for(int i=0; i<length; i++) {
map.put(genres[i], map.getOrDefault(genres[i], 0)+plays[i]);
}
//mapKey는 map의 value 내림차순의 Key순서
ArrayList<String> mapKey = new ArrayList<>(map.keySet());
Collections.sort(mapKey, (o1, o2) ->
(map.get(o2).compareTo(map.get(o1))));
ArrayList<Integer> playsList = new ArrayList<Integer>();
//mapKey의 key값 만큼만 돌리면 해당key일 때의 최고순위 알수있음
for(int i=0; i<mapKey.size(); i++) {
String type = mapKey.get(i);
//해당 장르중 가장 큰 값 찾기, 변수들의 각 장르마다 초기화가 필요하다.
int max = 0;
int idx = -1;
for(int j=0; j<length; j++) {
if(type.equals(genres[j]) && (max < plays[j])) {
max = plays[j];
idx = j;
}
}
//두번째 찾기
int secidx = -1; max = 0;
for(int j=0; j<length; j++) {
if(type.equals(genres[j]) && (max < plays[j]) && (j != idx)) {
max = plays[j];
secidx = j;
}
}
//인덱스 값 넣기. 두번째 인덱스는 없을 수도 있음. -1이 들어가면 안됨
playsList.add(idx);
if(secidx>=0) playsList.add(secidx);
}
int ansSize = playsList.size();
int[] answer = new int[ansSize];
for(int i=0; i<ansSize; i++) {
answer[i] = playsList.get(i);
}
return answer;
}
}
728x90
300x250
@mag1c :: 꾸준히 재밌게
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!