일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- java
- 파이썬
- python
- DateTime
- 정규식
- backjoon
- lambda
- 다익스트라
- Set
- 카카오
- programmers
- 자바
- Combinations
- dfs
- 재귀함수
- 백준
- BFS
- KAKAO BLIND RECRUITMENT
- 동적 계획법
- 정렬
- 그리디
- Zip
- Re
- 추석맞이 코딩챌린지
- divmod
- 위클리 챌린지
- 프로그래머스
- heapq
- 수학
- 이분탐색
Archives
- Today
- Total
상상쓰
[프로그래머스] 베스트앨범 본문
https://programmers.co.kr/learn/courses/30/lessons/42579?language=java
정렬을 통하여 문제를 해결하였다.
playsIndex 는 [재생 횟수, 고유번호] 로 이루어진 2차원 배열이다. palysIndex 를 재생 횟수를 기준으로 내림차순, 고유번호를 기준으로 오름차순 하여 map2 에 값을 넣을 때, 같은 고유번호라도 우선순위가 조건에 맞도록 하기 위해서다.
map 은 어떤 genre 가 재생 횟수가 가장 많은지에 대한 정보를 담고 있으므로 map 의 key 를 정렬하여 map2 에서 각 genre 에 우선순위에 맞게 정렬된 고유번호를 최대 2개 뽑아서 answer 에 담는다.
다음 answer 을 int[] 배열로 변환하여 return 해준다.
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
List<Integer> answer = new ArrayList<>();
int[][] playsIndex = new int[plays.length][2];
for (int i=0;i<plays.length;i++) {
playsIndex[i][0] = plays[i];
playsIndex[i][1] = i;
}
Arrays.sort(playsIndex, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[0] == o2[0]) {
return o1[1] - o2[1];
} else {
return o2[0] - o1[0];
}
}
});
HashMap<String, Integer> map = new HashMap<>();
HashMap<String, List<Integer>> map2 = new HashMap<>();
for (int i=0;i<playsIndex.length;i++) {
if (map.containsKey(genres[playsIndex[i][1]])) {
map.put(genres[playsIndex[i][1]], map.get(genres[playsIndex[i][1]]) + playsIndex[i][0]);
map2.get(genres[playsIndex[i][1]]).add(playsIndex[i][1]);
} else {
map.put(genres[playsIndex[i][1]], playsIndex[i][0]);
List<Integer> list = new ArrayList<Integer>();
list.add(playsIndex[i][1]);
map2.put(genres[playsIndex[i][1]], list);
}
}
List<String> keySetList = new ArrayList<>(map.keySet());
Collections.sort(keySetList, (o1, o2) -> (map.get(o2).compareTo(map.get(o1))));
for (String key : keySetList) {
int cnt = 0;
for (int i : map2.get(key)) {
cnt++;
answer.add(i);
if (cnt == 2) {
break;
}
}
}
return answer.stream().mapToInt(i -> i).toArray();
}
}
'Coding Test' 카테고리의 다른 글
[백준] 에라토스테네스의 체 (0) | 2021.07.30 |
---|---|
[프로그래머스] 올바른 괄호의 갯수 (0) | 2021.07.29 |
[프로그래머스] 카펫 (0) | 2021.07.28 |
[프로그래머스] 프린터 (0) | 2021.07.27 |
[프로그래머스] 타겟 넘버 (0) | 2021.07.26 |
Comments