PS

[프로그래머스] 베스트앨범 자바 풀이

E58C 2023. 4. 6. 22:51

https://school.programmers.co.kr/learn/courses/30/lessons/42579#

 

프로그래머스

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

programmers.co.kr

 

문제 풀이

문제를 잘 못 읽어 푸는데 오래 걸렸습니다.

 

1. 장르별 재생 횟수 모으기

2. 고유번호별 재생 횟수 모으기

3. 각각 내림차순 정렬

4. 각 장르별 최대 2개씩 넣기

5. 재생 횟수가 같다면 고유번호가 낮은 것부터

 

이걸 하면 됩니다.

내림차순 정렬 하고, 재생 횟수 * -1 을 해서 넣어주고 오름차순 정렬도 했습니다.

테스트 케이스 2, 15번이 틀린다면 무조건

장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.

라는 조건을 만족시키지 못해서입니다. 

 

저 조건을 만족시키려고 temp list를 만들어서 비교했습니다.

 

import java.util.*;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        List<Integer> answer = new ArrayList<>();
        Map<String, Integer> map = new HashMap<>(), musicMap = new HashMap<>();
        for (int i = 0; i < genres.length; i++) {
            map.put(genres[i], map.getOrDefault(genres[i],0)+plays[i]); // 장르별 재생 횟수 저장
            musicMap.put(genres[i]+i, plays[i]*-1); // 노래 & 재생 횟수 저장
        }
        List<String> genresList = new ArrayList<>(map.keySet()), musicList = new ArrayList<>(musicMap.keySet());
        genresList.sort((o1,o2)->map.get(o2).compareTo(map.get(o1))); // 장르별 재생 횟수 내림차순 정렬
        musicList.sort(Comparator.comparing(musicMap::get));
        for (int i = 0; i < genresList.size(); i++) {
            int time = 0;
            List<Integer> temp = new ArrayList<>();
            for (int j = 0; j < musicList.size(); j++) {
                if (musicList.get(j).contains(genresList.get(i))) {
                    answer.add(Integer.valueOf(musicList.get(j).replaceAll("\\D","")));
                    time++;
                    temp.add(musicMap.get(musicList.get(j)));
                }
                if (time == 2) {
                    if (Objects.equals(temp.get(0), temp.get(1))) {
                        int a = answer.get(answer.size()-1);
                        answer.set(answer.size()-1, answer.get(answer.size()-2));
                        answer.set(answer.size()-2, a);
                    }
                    break;
                }
            }
        }
        return answer.stream().mapToInt(i->i).toArray();
    }
}

다른 분들 코드를 보면 class를 만들어서 구현하셨습니다. 

그게 더 효율이 좋을 것입니다.

 

왜냐면 제 코드가 효율이 나쁩니다. 통과 못하는 줄~

안녕히계세요뿅~