문제풀이/프로그래머스
[프로그래머스]베스트앨범 - JAVA
빈둥벤둥
2021. 3. 3. 13:36
문제
programmers.co.kr/learn/courses/30/lessons/42579
코딩테스트 연습 - 베스트앨범
스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가
programmers.co.kr
풀이
HashMap을 사용하는 문제로 HashMap에 관련된 다양한 연산들을 연습해 볼 수 있는 구현, 시뮬레이션 문제였다.
문제는 다음과 같은 과정으로 풀어 나갔다.
- hashmap에 장르별 play횟수를 중첩해서 더해준다.
- hashmap의 key값만을 추출하여 리스트를 만들고, 리스트를 play횟수를 기준으로 정렬한다. (hashmap은 순서가 없기 때문에 정렬할 수 없으므로 리스트를 만들어 정렬해 주어야 한다.)
- key값을 정렬한 리스트에서 제일 많은 횟수를 재생한 장르부터 장르별 제일 많은 횟수가 플레이된 인덱스, 두번째로 많은 횟수가 플레이된 인덱스를 찾아 정답 배열에 순서대로 넣어준다.
- 이때 두번째로 많은 횟수가 플레이된 인덱스는 존재하지 않을 수도 있기 때문에 이를 잘 처리해준다.
- 정답 리스트를 배열로 변환하여 반환한다.
이 문제에서 사용한 hashmap 메소드는 다음과 같다.
- map.getOrDefault(genres[i], 0) + plays[i];
- map.keySet();
첫 번째 함수는 map에 genres[i]값이 있다면 그 값에 + plays[i]를 하고 없다면, 그 값을 0 이라고 생각하고 + plays[i]를 하라는 함수이다.
두 번째 함수는 map에서 key만을 추출하는 함수이다. iterator메소드를 사용하여 가져온다.
코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
Map<String, Integer> map = new HashMap<>();
for(int i = 0; i < genres.length; i++) {
map.put(genres[i], map.getOrDefault(genres[i], 0) + plays[i]);
}
//key값만 가져와서 genre에 넣어준다
ArrayList<String> genre = new ArrayList<>();
for(String key : map.keySet()) {
genre.add(key);
}
Collections.sort(genre, (o1, o2) -> map.get(o2) - map.get(o1)); //key값에 해당하는 value를 내림차순으로 정렬한다.
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0; i < genre.size(); i++) {
String g = genre.get(i);
//해당 장르의 음악 중에서 play횟수가 가장 큰 인덱스를 찾는다
int max = 0;
int firstIdx = -1;
for(int j = 0; j < genres.length; j++) {
if(g.equals(genres[j]) && max < plays[j]) {
max = plays[j];
firstIdx = j;
}
}
//해당 장르의 음악 중에서 play횟수가 두번째로 큰 인덱스를 찾는다.
max = 0;
int secondIdx = -1;
for(int j = 0; j < genres.length; j++) {
if(g.equals(genres[j]) && max < plays[j] && j != firstIdx) {
max = plays[j];
secondIdx = j;
}
}
list.add(firstIdx);
if(secondIdx >= 0) list.add(secondIdx); //secondIdx는 존재 할수도, 안할수도 있다.
}
int[] result = new int[list.size()];
for(int i = 0; i < list.size(); i++) {
result[i] = list.get(i);
}
return result;
}
}
|
cs |