코테/프로그래머스

[프로그래머스/Lv. 3] 베스트앨범 (JAVA)

imname1am 2023. 10. 19. 13:52
반응형

🔺 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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

 

반응형