한번에 로직이 세워지지 않았던 문제이다.
HashMap에 익숙해졌다고 생각했지만 values를 기준으로 내림차순 정렬하는데 어려움을 겪었다.
로직
먼저 genres와 play값을 HashMap에 넣어 각 장르별 플레이 횟수를 센다.
그리고 keySet을 리스트에 넣어 플레이 횟수별로 내림차순 정렬한다.
정렬된 list의 값을 순회하면서 첫번째와 두번째로 많이 재생된 노래의 인덱스를 result 리스트에 넣고
마지막으로 배열로 복사해서 반환하면 된다.
최종 코드
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
List<Integer> result = new ArrayList<>();
// 각 장르별로 HashMap에 넣기
HashMap<String, Integer> genreMap = new HashMap<>();
for (int i = 0; i < genres.length; i++) {
genreMap.put(genres[i], genreMap.getOrDefault(genres[i], 0) + plays[i]);
}
// keySet을 value 기준으로 내림차순 정렬
List<String> list = new ArrayList<>(genreMap.keySet());
Collections.sort(list, (o1, o2) -> genreMap.get(o2) - genreMap.get(o1));
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
// 첫번째로 많이 재생된 노래 찾기
int firstMax = 0;
int firstIdx = -1;
for (int j = 0; j < genres.length; j++) {
if (genres[j].equals(s) && firstMax < plays[j]) {
firstMax = Math.max(firstMax, plays[j]);
firstIdx = j;
}
}
// 두번째로 많이 재생된 노래 찾기
int secondMax = 0;
int secondIdx = -1;
for (int j = 0; j < genres.length; j++) {
if (genres[j].equals(s) && secondMax < plays[j] && j != firstIdx) {
secondMax = plays[j];
secondIdx = j;
}
}
// 재생된 노래 리스트에 저장
result.add(firstIdx);
// 두번째로 재생된 노래가 있다면 리스트에 저장
if (secondIdx >= 0) {
result.add(secondIdx);
}
}
// 리스트값 배열로 복사
int[] answer = new int[result.size()];
for (int i = 0; i < result.size(); i++) {
answer[i] = result.get(i);
}
return answer;
}
}
'코딩 테스트' 카테고리의 다른 글
(Java) 프로그래머스 - 둘만의 암호 (0) | 2023.02.16 |
---|---|
(Java) 프로그래머스 - 카드 뭉치 (0) | 2023.02.16 |
(Java) 프로그래머스 - 단속카메라 (0) | 2022.10.17 |
(Java) 프로그래머스 - 등굣길 (0) | 2022.10.17 |
(Java) 프로그래머스 - 단어 변환 (0) | 2022.10.11 |