[프로그래머스/Lv. 3] 베스트앨범 (JAVA)
🔺 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🔺 코드
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
|
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) { // 장르, 재생 횟수
/*** [1] Map 생성해서 값 저장하기 ***/
// 1. <장르, 재생횟수> 저장용 map
Map<String, Integer> map1 = new HashMap<>();
for(int i = 0 ; i < genres.length ; i++) {
map1.put(genres[i], map1.getOrDefault(genres[i], 0) + plays[i]);
}
// 2. <고유번호, 재생횟수> 저장용 map
Map<Integer, Integer> map2 = new HashMap<>();
for(int i = 0 ; i < plays.length ; i++) {
map2.put(i, plays[i]);
}
/*** [2] 정렬하기 ***/
// 1. 재생횟수 기준 내림차순 정렬
List<String> genreList = new ArrayList<>(map1.keySet());
Collections.sort(genreList, (o1, o2) -> map1.get(o2).compareTo(map1.get(o1))); // map.get(o2) - map.get(o1)해도 됨
// 2. 고유번호 기준 내림차순 정렬
List<Integer> indexList = new ArrayList<>(map2.keySet());
Collections.sort(indexList, (o1, o2) -> map2.get(o2).compareTo(map2.get(o1)));
/*** [3] 정답 리스트 구하기 ***/
List<Integer> answerList = new ArrayList<>();
for(String g : genreList) {
int cnt = 1;
for(int i : indexList) {
if(genres[i].equals(g) && cnt < 3) { // 장르가 같고, Top2 안에 들면 정답 리스트에 넣음
cnt++;
answerList.add(i);
}
}
}
return answerList.stream().mapToInt(i->i).toArray(); // 리스트를 배열로 변환
}
}
|
cs |
🧩 해결 아이디어
• HashMap & 리스트 정렬 (HashMap value 기준 정렬)
• key값들을 ArrayList에 넣음
- map.keySet()
// ⭐ 방법1
List<String> genreList = new ArrayList<>(map1.keySet());
// 방법2
List<String> genreList = new ArrayList<>();
for(String item : map1.keySet()) {
genreList.add(item;
}
• Map의 value 값들 정렬 -> 따로 리스트 만들어 정렬
- .compareTo() : 숫자끼리 비교 (참고)
// 방법 1 : 람다식 활용
genreList.sort((o1, o2) - > map1.get(o2) - map1.get(o1)));
// 방법 2 : Collections.sort 활용
Collections.sort(genreList, (o1, o2) -> map1.get(o2).compareTo(map1.get(o1)));
• 리스트를 배열로 변환하는 람다식
answerList.stream().mapToInt(i->i).toArray();
🔺 다른 풀이들
- Class를 따로 만들어 값을 저장하고, 정렬해 활용하셨다.
프로그래머스 - 베스트앨범 (JAVA)
문제 링크 문제 설명 스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같
hy-ung.tistory.com
[프로그래머스] 베스트앨범 (Java, 자바)
https://school.programmers.co.kr/learn/courses/30/lessons/42579 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는
gogigood.tistory.com
💬 느낀 점
• Map의 value들 기준으로 정렬하고 싶을 땐, 따로 만들고 여기에 map의 값들을 집어넣고 정렬하기!
• 리스트를 배열로 변환하는 람다식도 잊지 말기!
한 문제 안에서 배울 점이 엄청 많은 문제!!!
이거 진짜 복습 많이 해서 내걸로 만들어야겠다...
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
[프로그래머스 : 레벨 3] 베스트 앨범 : List를 이용한 정렬(Java)
문제 스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노
wpioneer.tistory.com
- 복습용으로 짱..
프로그래머스 - 베스트앨범 (JAVA)
문제 링크 문제 설명 스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같
hy-ung.tistory.com