문제
https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=java
풀이
- 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
- 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
- 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
• 장르에 속한 곡이 하나라면, 하나의 곡만 선택합니다.
이 조건들을 위주로 생각하여 문제를 풀었다.
우선, 장르, 재생횟수, 인덱스를 저장하기 위해 Triple이라는 자료구조를 하나 만들어줬다.
또한, 장르별 재생횟수를 저장하기 위해 Pair 자료구조와 함께 HashMap을 사용했다.
Triple 자료구조를 저장하는 list에 모든 데이터를 담고, 이 후 재생횟수 순서대로 Triple을 정렬시켜줬다.
이후 이중 for문을 통해 장르별 최대 두개의 곡을 선택한다. 횟수가 2회가 되면 반복문을 종료하게 했다. 이로써 장르에 곡이 1개인 경우 해당 인덱스를 하나만 추가하게 된다.
list 자료구조에 담은 데이터를 배열로 변환하여 리턴하면 끝
코드
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
class Solution {
class Pair<T,V> {
T first;
V second;
public Pair(T first, V second) {
this.first = first;
this.second = second;
}
}
class Triple<T,K,V> {
T first;
K second;
V third;
public Triple(T first, K second, V third) {
this.first = first;
this.second = second;
this.third = third;
}
}
public int[] solution(String[] genres, int[] plays) {
int[] answer = {};
HashMap<String, Integer> map = new HashMap<>();
ArrayList<Triple<Integer, String, Integer>> list = new ArrayList<>();
ArrayList<Pair<String, Integer>> arrayList = new ArrayList<>();
ArrayList<Integer> ans = new ArrayList<>();
for (int i = 0; i < genres.length; i++) {
map.put(genres[i], map.getOrDefault(genres[i], 0) + plays[i]);
list.add(new Triple(i, genres[i], plays[i]));
}
map.forEach((s, i) -> {
arrayList.add(new Pair(s,i));
});
Collections.sort(list, new Comparator<Triple<Integer, String, Integer>>() {
@Override
public int compare(Triple<Integer, String, Integer> o1,
Triple<Integer, String, Integer> o2) {
return o2.third - o1.third;
}
});
Collections.sort(arrayList, new Comparator<Pair<String, Integer>>() {
@Override
public int compare(Pair<String, Integer> o1, Pair<String, Integer> o2) {
return o2.second-o1.second;
}
});
int idx = 0;
for (int i = 0; i < arrayList.size(); i++) {
String s = arrayList.get(i).first;
int cnt = 0;
for (int j = 0; j < list.size(); j++) {
if (cnt == 2) break;
if (list.get(j).second.equals(s)) {
ans.add(list.get(j).first);
cnt++;
}
}
}
answer = new int[ans.size()];
for (int i = 0; i < ans.size(); i++) {
answer[i] = ans.get(i);
}
return answer;
}
}
'알고리즘' 카테고리의 다른 글
[프로그래머스] 게임 맵 최단거리 자바 풀이 (0) | 2024.03.21 |
---|---|
[프로그래머스] 메뉴 리뉴얼 자바 풀이 (0) | 2024.03.20 |
[프로그래머스] PCCP 기출문제 4번 / 수레 움직이기 자바 풀이 (0) | 2024.03.15 |
[백준] 1091 카드 섞기 자바 풀이 (0) | 2024.03.14 |
[백준] 1360번 되돌리기 자바 풀이 (0) | 2024.03.13 |